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.