В PHP все не частные функции являются виртуальными, поэтому нет необходимости явно объявлять их виртуальными.
Объявление функции-члена как abstract
просто означает, что базовый класс не может предоставить реализацию, но все производные классы должны. Определение метода как абстрактного аналогично выполнению следующего в C++.
virtual void foo() = 0;
Это просто означает, что производные классы должны реализовывать foo();
EDIT: относительно отредактированного вопроса
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()
виртуальной или нет, поскольку предполагаемый тип известен (программист явно предоставил его)
person
Yacoby
schedule
21.03.2010