В PHP все никакие частные функции не являются виртуальными, поэтому нет необходимости явно объявлять их как виртуальные.
Объявление функции-члена как abstract
просто означает, что базовый класс не может обеспечить реализацию, но все производные классы должны. Определение метода как абстрактного аналогично выполнению следующего в C ++
virtual void foo() = 0;
Это просто означает, что производные классы должны реализовать foo();
РЕДАКТИРОВАТЬ : относительно отредактированного вопроса
b::call()
не может получить доступ a::test()
. По этой причине при вызове закрытых функций будет вызываться только та из класса, из которой они были вызваны.
EDIT :
По поводу комментария:
(из Википедии)
В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено в классе наследования функцией с такой же сигнатурой.
Из-за идеи явного указания того, за что вы платите в 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
}
Изменить базу на виртуальную
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()
или нет, так как предполагаемый тип известен (программист явно предоставил его )