Каков эквивалент виртуальных функций C++ в PHP?

Это abstract function xxx?

Я просто сделал тест, который, кажется, указывает на закрытый метод быть виртуальным также?

class a {
 private function test()
 {
  echo 1;
 }
}

class b extends a {
 private function test()
 {
  echo 2;
 }
 public function call()
 {
  $this->test();
 }
}

$instance = new b;
$instance->call();

Вывод 2

9
задан user198729 21 March 2010 в 16:26
поделиться

1 ответ

В PHP все частные функции не являются виртуальными, поэтому нет необходимости явно объявлять их виртуальными.

Объявление функции-члена как abstract просто означает, что базовый класс не может предоставить реализацию, но все производные классы должны. Определение метода как абстрактного аналогично выполнению следующего в C ++

virtual void foo() = 0;

, что просто означает, что производные классы должны реализовывать foo ();

EDIT : Относительно отредактированного вопроса

b :: call () не может получить доступ к a :: test () . По этой причине при вызове закрытых функций будет вызываться только тот из класса, из которого он был вызван.

РЕДАКТИРОВАТЬ : Относительно комментария:

(Из Wikipieda)

В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых можно переопределить в пределах наследующий класс функцией с той же сигнатурой.

Из-за идеи явного указания того, за что вы платите в C ++, вы должны объявить функции как виртуальные, чтобы позволить производным классам переопределять функцию.

class Foo{
public:
    void baz(){
        std::cout << "Foo";
    }
};
class Bar : public Foo{
public:
    void baz(){
        std::cout << "Bar";
    }
};

int main(){
    Foo* f = new Bar();
    f->baz(); //baz is not virtual in Foo, so the output is Foo
}

Измените baz на виртуальный

class Foo{
public:
    virtual void baz(){
        std::cout << "Foo";
    }
};
//Same Bar declaration

int main(){
    Foo* f = new Bar();
    f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function
}

Обратите внимание: если бы переменная f в приведенном выше примере имела тип Bar * или Bar , она бы не неважно, был ли Foo :: baz () виртуальным или нет, поскольку предполагаемый тип известен (программист явно предоставил его)

18
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: