Chiamare una funzione di override da una classe base?
-
28-09-2019 - |
Domanda
La mia domanda sarà probabilmente essere meglio spiegato con un esempio.
Per esempio, ho 2 classi: una classe base e una classe derivata:
class baseClass
{
public:
baseClass()
{
foo();
}
virtual bool foo() { printf("baseClass"); return false;}
};
class derivedClass : public baseClass
{
public:
bool foo()
{
printf("derivedClass");
return true;
}
};
Quando creo un'istanza derivedClass
, il costruttore in baseClass
sarà chiamato, e foo()
sarà chiamato da esso del costruttore. Il problema è, costruttore delle BaseClass' sta chiamando il proprio foo()
e non il foo()
override che la classe derivata ha ignorato. Esiste un modo per rendere i BaseClass chiamano la funzione override, non è proprio la definizione della funzione?
Soluzione
Non si dovrebbe chiamare un metodo virtuale da un costruttore perché l'oggetto non è stato ancora completamente costruito. In sostanza, la classe derivata non esiste ancora, per cui i suoi metodi non possono essere chiamati.
Altri suggerimenti
Nella maggior parte delle lingue, questo comportamento è vietato o undefined, con buona ragione.
Considerate questo: il costruttore della classe base viene eseguito prima il costruttore della sottoclasse, in modo che qualsiasi vars definito dalla sublass verrà inizializzata. Sei sicuro che si desidera chiamare il metodo sottoclasse in queste circostanze?
L'alternativa più semplice è quello di definire un metodo initialize () nella superclasse, quindi basta ricordarsi di chiamare Initialize () dal costruttore della sottoclasse.