Kurs C++
Metody wirtualne w konstruktorach
[lekcja] Jak zachowują się metody wirtualne w konstruktorach.Metody wirtualne, które są wywoływane w konstruktorze zachowują się jak zwykłe metody, czyli jak metody niewirtualne. Takie zachowane jest określone przez standard C++. Oznacza to, że metoda wirtualna klasy potomnej
nie wywoła się wewnątrz konstruktora klasy bazowej.
Zachowanie wyżej opisane ma swoje uzasadnienie. W chwili wywołania konstruktora klasy bazowej z poziomu konstruktora klasy pochodnej, stan klasy pochodnej jest jeszcze nieustalony. Wywoływanie metody na obiekcie o stanie nieustalonym byłoby nieprzewidywalne w skutkach, a w konsekwencji prowadziłoby to do krytycznych błędów aplikacji.
Przykład
#include <cstdio>
class A
{
public:
A()
{
x();
}
virtual void x()
{
printf( "A::x()\n" );
}
};
class B
: public A
{
public:
B()
{
}
virtual void x()
{
printf( "B::x()\n" );
}
};
int main()
{
B b;
return 0;
}
Standardowe wyjście programu:
A::x()
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.