Si consideri il seguente codice:Pure casi interessanti chiamata di funzione virtual
#include <iostream>
using namespace std;
class A
{
public:
virtual void f() = 0;
A(){f();}
};
void A::f() {
cout<<"A"<<endl;
}
class B:public A{
public:
void f(){cout<<"B"<<endl;}
};
int main()
{
B b;
}
In questo caso io chiamo direttamente la funzione virtuale dal costruttore e ottenere avviso del compilatore che dice:
avvertimento: astratto virtuale 'vuoto A virtuali: : f() 'chiamato dal costruttore.
Ma esegue senza interruzione e stampe A.
Se mi avvolgo il richiamo della funzione come questa:
class A
{
public:
virtual void f() = 0;
A(){g();}
void g(){f();}
};
void A::f(){cout<<"A"<<endl;}
class B:public A{
public:
void f(){cout<<"B"<<endl;}
};
int main()
{
B b;
}
Il compilatore non emette alcun avviso durante la compilazione ma schiaccia in fase di esecuzione con il seguente messaggio:
pure virtual method called
terminate called without active exception
Abort
Qualcuno può spiegare il comportamento di entrambi i casi?
Suggerimento: http://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors – dragosht