Kolejność wywołań konstruktorów, destruktorów itp

0

Witam,
Czy ktoś mógłby mi powiedzieć jak dokładnie wygląda proces tworzenia, a potem niszczenia obiektów w c++? Chodzi mi dokładnie o to, które konstruktory wywoływane są najpierw(klasy bazowej, potomnej, czy może konstruktory pól składowych), co jeżeli funkcje wywoływane w konstruktorach są wirtualne itd.
Np.

class A
{
public:
virtual void f()
{
cout<<"A.f()";
}
~A()
{
f();
}
};

class B : public A
{
A a;
public:
void f()
{
cout<<"B.f()";
}
B()
{
throw -1;
}
~B()
{
f();
}
};

int main()
{
try
{
B b;
}
catch(...)
{
cout<<"Exc";
}
return 0;
};

Jaka będzie kolejność wywołań w tym przykładzie? Co i najważniejsze dlaczego się wyświetli?

0
class A
{
    public:
        A() { cout << "Konstruktor klasy A\n"; }
        virtual ~A() { cout << "Destruktor klasy A\n"; }
        virtual void foo(){ cout << "Foo z klasy A\n"; }
};

class B : public A
{
    public:
        B() { cout << "Konstruktor klasy B\n"; }
        ~B() { cout << "Destruktor klasy B\n"; }
        void foo(){ cout << "Foo z klasy B\n"; }
};

int main()
{
    B *b = new B();
    b->foo();
    delete b;

    cout << "---------------------------\n";

    A *a = new A();
    a->foo();
    delete a;

    cout << "---------------------------\n";

    a = new B();
    a->foo();
    delete a;
    return 0;
}

Skompiluj i odpal, następnie usuń virtual sprzed destruktora i odpal (porównaj z poprzednim wydrukiem). Usuń sobie również virtual sprzed foo() i zobacz co się stanie.
O kolejności nie będę mówić bo sam zobaczysz. Wniosek jest taki, że podczas stosowania dziedziczenia oraz metod wirtualnych, destruktor klasy bazowej powinien być wirtualny.

0

Dodaj sobie jeszcze przed klasą "A" taką klasę

class C {
    public:
        C() { cout << "Konstruktor klasy C\n"; }
        ~C() { cout << "Destruktor klasy C\n"; }
};

I zamieść jej obiekt jako pole w klasie "A", potem w "B" itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1