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.

questionAnswers(3)

yourAnswerToTheQuestion