In PHP tutte le funzioni private nessuno sono virtuali quindi non c'è alcun bisogno di loro dichiarare esplicitamente come virtuale.
Dichiarare una funzione membro come abstract
significa semplicemente che la classe base non può fornire un'implementazione ma tutte le classi derivate dovrebbero. Definire il metodo come astratto è lo stesso di fare il seguente in C++
virtual void foo() = 0;
che significa semplicemente che le classi derivanti devono implementare foo();
EDIT: Riguardo la domanda a cura
b::call()
non può accedere a::test()
. Per questo motivo quando si chiamano funzioni private verrà chiamato solo quello della classe da cui è stato chiamato.
EDIT: quanto riguarda il commento:
(da Wikipieda)
Nella programmazione orientata agli oggetti, una funzione virtuale o metodo virtuale è una funzione o metodo cui comportamento può essere ignorato all'interno una classe ereditante da una funzione con la stessa firma.
A causa dell'idea di affermare esplicitamente ciò che si paga in C++, è necessario dichiarare le funzioni come virtuali per consentire alle classi derivate di sovrascrivere una funzione.
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
}
Change baz essere virtuale
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, se la variabile f
nell'esempio precedente sia di tipo Bar*
o Bar
non sarebbe importa se Foo::baz()
era virtuale o non come il tipo previsto è noto (il programmatore lo ha fornito esplicitamente)
Grazie per la demo, ho capito cosa significa virtuali now.But può lo provi anche con PHP?Perché sembra in PHP è impossibile convertire un oggetto nella classe base, in altre parole, non esiste un concetto come virtuale in PHP? – user198729
Non esiste un concetto come virtual in php. Al contrario, ogni metodo è virtuale poiché l'effettiva implementazione viene esaminata in fase di runtime. – VolkerK
Penso che sia meglio pensare che non ci sia un concetto virtuale in PHP, dato che è impossibile farlo in questa lingua: 'Foo * f = new Bar();' – user198729