Rozważmy następujący kod:czysto wirtualne wywołanie funkcji interesujących przypadków
#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;
}
w tym przypadku bezpośrednio wywołać funkcję wirtualnego z konstruktora i dostać ostrzeżenie kompilatora, który mówi:
ostrzegawczy: abstrakcyjne wirtualny „virtual void A: : f() "wywołany z konstruktora.
Ale to wykonuje bez wypowiedzenia i drukuje A.
Gdybym zawinąć wywołanie funkcji takiego:
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;
}
Kompilator nie emituje żadnego ostrzeżenia podczas kompilacji ale miażdży przy starcie z następujących wiadomość:
pure virtual method called
terminate called without active exception
Abort
Czy ktoś może wyjaśnić zachowanie obu tych przypadków?
Podpowiedź: http://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors – dragosht