Wywołanie funkcji wirtualnej z konstruktora
czytamEfektywny C ++i jest „Punkt 9: Nigdy nie wywołuj funkcji wirtualnych podczas budowy lub niszczenia”. I zastanawiam się, czy mój kod jest w porządku, nawet jeśli łamie tę zasadę:
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);
}
Czy jest coś nie tak z tym podejściem? Czy mogę mieć kłopoty, kiedy robię coś bardziej skomplikowanego?
Wydaje mi się, że większość odpowiedzi nie dostała tego, co tam zrobiłem, i po prostu wyjaśnili, dlaczego wywołanie funkcji wirtualnej z konstruktora jest potencjalnie niebezpieczne.
Chciałbym podkreślić, że wyniki mojego programu wyglądają tak:
logging A
logging B
Otrzymuję więc A, gdy jest on skonstruowany, a B jest rejestrowany, gdy jest skonstruowany. I to właśnie jachcieć! Ale pytam, czy znajdziesz coś złego (potencjalnie niebezpiecznego) w moim „hacku”, aby przezwyciężyć problem z wywołaniem funkcji wirtualnej w konstruktorze.