Sto leggendo Effective C++, e c'è il "Punto 9: Non chiamare mai le funzioni virtuali durante la costruzione o la distruzione". E mi chiedo se il mio codice è bene anche se si rompe questa regola:Chiamare una funzione virtuale dal costruttore
using namespace std;
class A{
public:
A(bool doLog){
if(doLog)
log();
}
virtual void log(){
cout << "logging A\n";
}
};
class B: public A{
public:
B(bool doLog) : A(false){
if(doLog)
log();
}
virtual void log(){
cout << "logging B\n";
}
};
int main() {
A a(true);
B b(true);
}
C'è qualcosa di sbagliato in questo approccio? Posso finire nei guai quando faccio qualcosa di più complicato?
cuciture a me che la maggior parte delle risposte non ha ottenuto quello che ho fatto lì, e hanno semplicemente spiegato ancora una volta il motivo per cui sta chiamando funzione virtuale dal costruttore potenzialmente pericolosi.
vorrei sottolineare che l'uscita del mio programma si presenta così:
logging A
logging B
Così ho un registrato quando si è costruito e B registrato quando si è costruito. E questo è quello che voglio ! Ma ti sto chiedendo se trovi qualcosa di sbagliato (potenzialmente pericoloso) con il mio "hack" per superare il problema con il richiamo della funzione virtuale nel costruttore.
In questo caso l'hai corretto correttamente, ma se altre persone hanno bisogno di usare quel codice, gli errori sono tenuti a verificarsi. –
@JoachimPileborg questo non è vero: il comportamento * è * definito. Durante la costruzione, le chiamate alle funzioni virtuali sono disabilitate (ad esempio viene utilizzata l'implementazione del tipo attualmente in costruzione). –