Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
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

C/C++
#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()
Poprzedni dokument Następny dokument
Debugowanie na przykładzie Visual Studio 2017 Wirtualne destruktory