Инициализируйте объект с помощью конструктора производного класса

Рассмотрим следующий код C++:

#include <iostream>

using std::cout;

class A
{
public:
    int a;

    A():a(0)
    {
        cout << "A constructor\n";
    }

    virtual void f()
    {
        cout << "f inside A\n";
    }
};

class C : public A
{
public:
    int c;

    virtual void f()
    {
        cout << "f inside C\n";
    }

    C():c(0)
    {
        cout << "C constructor\n";
    }
};

int main()
{
    A varA = C();

    cout << "Size of C class: " << sizeof(C) << "\n";
    cout << "Size of varA object: " << sizeof(varA) << "\n";

    C* varC = static_cast<C*>(&varA);
    varC->f();

    cout << "varC->a is " << varC->a << "\n";
    cout << "varC->c is " << varC->c << "\n";
}

Выход этой программы:

A constructor
C constructor
Size of C class: 16
Size of varA object: 8
f inside A
varC->a is 0
varC->c is 1726166356

Я инициализирую varA объект с конструктором класса C, Конструкторы классов A и C называются, но varA это просто A объект. Я бросил адрес varA в C* типа и я пытаюсь назвать его f() функция, но она печатает f() функция класса A, поэтому я делаю вывод, что для его вызова используется механизм раннего связывания. Я думаю, что если я вызову конструктор производного класса, как в этом случае, я получу тот же объект, если бы я вызвал базовый конструктор. Я думаю, что единственная разница в том, что другие конструкторы называются. Правильно ли мое предположение или есть другие отличия?

2 ответа

Решение

Классический пример нарезки. A varA = C(); оставляет вас с объектом статического и динамического типа A, В следствии, C* varC = static_cast<C*>(&varA); проявляет неопределенное поведение.

Однако вы можете сохранить полный производный класс в указателе базового класса:

int main() {        
  A* varA = new C();
  C* varC = static_cast<C*>(varA);
  varC->f();

  cout << "varC->a is " << varC->a << endl;
  cout << "varC->b is " << varC->b << endl;
  cout << "varC->c is " << varC->c << endl;
} // oops, forgot to delete varA/varC, memory leak!
Другие вопросы по тегам