In PHP sind alle nicht privaten Funktionen virtuell, daher ist es nicht notwendig, sie explizit als virtuell zu deklarieren.
Das Deklarieren einer Memberfunktion als abstract
bedeutet einfach, dass die Basisklasse keine Implementierung bereitstellen kann, aber alle abgeleiteten Klassen sollten. Die Definition der Methode als abstrakt ist dasselbe wie das folgende in C++
virtual void foo() = 0;
Das bedeutet einfach, dass abgeleitete Klassen müssen foo();
implementieren.
EDIT: In Bezug auf die bearbeitete Frage
b::call()
kann nicht auf a::test()
zugreifen. Aus diesem Grund wird beim Aufrufen privater Funktionen nur die in der Klasse aufgerufene Funktion aufgerufen.
EDIT: In Bezug auf den Kommentar:
(Von Wikipieda)
In der objektorientierten Programmierung ist eine virtuelle Funktion oder Methode eine Funktion oder Methode, deren Verhalten in einer ableitenden Klasse von einer Funktion mit derselben Signatur überschrieben werden kann.
Aufgrund der Idee, in C++ explizit anzugeben, wofür man bezahlt, müssen Funktionen als virtuell deklariert werden, um abgeleiteten Klassen das Überschreiben einer Funktion zu ermöglichen.
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 ist in Foo nicht virtual, daher lautet die Ausgabe Foo
}
Ändern Sie baz
, damit es virtual ist
class Foo{
public:
virtual void baz(){
std::cout << "Foo";
}
};
//Gleiche Bar-Deklaration
int main(){
Foo* f = new Bar();
f->baz(); //baz ist in Foo virtual, daher lautet die Ausgabe Bar, da die abgeleitete Funktion aufgerufen wird
}
Beachten Sie, wenn die Variable f
im obigen Beispiel vom Typ Bar*
oder Bar
wäre, wäre es egal, ob Foo::baz()
virtual ist oder nicht, da der beabsichtigte Typ bekannt ist (Der Programmierer hat ihn explizit angegeben)