En PHP todas las funciones privadas ninguno son virtuales así que no hay necesidad de declarar explícitamente como virtual.
Declarar una función de miembro como abstract
simplemente significa que la clase base no puede proporcionar una implementación, pero todas las clases derivadas deberían. Definir el método abstracto es lo mismo que hacer lo siguiente en C++
virtual void foo() = 0;
que simplemente significa que las clases derivadas deben aplicar foo();
EDITAR: cuanto a la pregunta editado
b::call()
no puede acceder a::test()
. Por esta razón, al llamar a funciones privadas, solo se llamará al de la clase desde la que se llamó.
EDITAR: En cuanto al comentario:
(De Wikipieda)
En la programación orientada a objetos, una función virtual o método virtual es una función o un método cuyo comportamiento puede ser anulado dentro de una clase heredada por una función con la misma firma.
Debido a la idea de declarar explícitamente lo que paga en C++, debe declarar las funciones como virtuales para permitir que las clases derivadas anulen una función.
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
}
Cambio Baz a ser virtual
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
}
Nota, si la variable f
en el ejemplo anterior fue de tipo Bar*
o Bar
no importaría si Foo::baz()
era virtual o no como el tipo previsto es conocido (El programador lo suministró explícitamente)
Gracias por la demo, entiendo lo que significa virtuales pueden now.But también lo pruebas con PHP?Porque parece que en PHP es imposible convertir un objeto a la clase base, en otras palabras, no existe un concepto como virtual en PHP. – user198729
No existe el concepto virtual en php. O al revés, todos los métodos son virtuales ya que la implementación real se busca en el tiempo de ejecución. – VolkerK
Creo que es mejor pensar que no hay un concepto virtual en PHP, ya que es imposible hacerlo en este lenguaje: 'Foo * f = new Bar();' – user198729