Это 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
В 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 ()
виртуальным или нет, поскольку предполагаемый тип известен (программист явно предоставил его)