Виртуальные пустоты, классы, конструкторы, полиморфизм - порядок исполнения - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с пониманием порядка выполнения в виртуальной программе на основе пустотности / полиморфизма.

Насколько я понимаю, что происходит в других выходных данных, я понятия не имею, почему эти команды:

a->b();
d->b();
d->a();
((G*)d) -> a();

дают следующие выводы:

Nieznany
Nieznany
Gniewosz

Может кто-нибудь объяснить, почему эти 3 метода выводят результаты, как указано выше?

#include <iostream>  
using namespace std; 

    class C { public:
    C() {cout << "Buduje A";}
    void a() {cout << "Nauczyciel" << endl;}
    virtual ~C() {cout << "~D" << endl;}
    virtual void b() {cout << "Nieznany" << endl; }; };

class G {
    int e; public:
    G() {cout << "Buduje G ";}
    void a() {cout << "Gniewosz " << endl;}
    ~G() {cout << "~C " << endl; }
    void b() {cout << "Draka" << endl;}; };

class A :public C {
    int o;
    int a;

public:
    A() {cout << "Buduje C ";}
    ~A() {cout << "~F " << endl;} };

class D :public A {
    float f; public:
    D() {cout << "Buduje D";}
    virtual void a() {cout << "Pośrednik" << endl;}
    ~D() {cout << "~E" << endl;} };

class B :public D {
    short s;
    int b; public:
    B() {cout << "Buduje E ";}
    ~B() {cout << "~G" << endl;} };

class E :public B {
    E() {cout << "Buduje B";}
    ~E() {cout << "~I" << endl;} };

class F :public G, public D { public:
    F() {cout << "Buduje F ";}
    void a() {cout << "Nieznany " << endl;}
    void b() {}
    ~F() {cout << "~H" << endl;} };

void nic() {cout << endl;}

int main() {
    C*a = new B();
    nic();
    a->b();
    D*d = new F;
    nic();
    d->b();
    d->a();
    ((G*)d) -> a();
    delete d;
    delete a;

    return 0; }
...