Llamando a una función virtual desde el constructor.

Estoy leyendoC ++ eficaz, y está el "Elemento 9: Nunca llamar a funciones virtuales durante la construcción o destrucción". Y me pregunto si mi código está bien, incluso si rompe esta regla:

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);
}

¿Hay algo malo con este enfoque? ¿Puedo meterme en problemas cuando hago algo más complicado?

Me parece que la mayoría de las respuestas no obtuvieron lo que hice allí, y simplemente explicaron por qué es potencialmente peligroso llamar a la función virtual desde el constructor.

Me gustaría subrayar que la salida de mi programa se ve así:

logging A
logging B

Entonces obtengo A cuando se construye y B cuando se construye. Y eso es lo que yo.querer! Pero le pregunto si encuentra algún error (potencialmente peligroso) con mi "pirateo" para superar el problema de llamar a la función virtual en el constructor.

Respuestas a la pregunta(3)

Su respuesta a la pregunta