用派生的类构造函数初始化对象

Initialize a object with a derived class constructor

本文关键字:初始化 对象 构造函数 派生      更新时间:2023-10-16

考虑以下C 代码:

#include <iostream>
using std::cout;
class A
{
public:
    int a;
    A():a(0)
    {
        cout << "A constructorn";
    }
    virtual void f()
    {
        cout << "f inside An";
    }
};
class C : public A
{
public:
    int c;
    virtual void f()
    {
        cout << "f inside Cn";
    }
    C():c(0)
    {
        cout << "C constructorn";
    }
};
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

i使用C类的构造函数初始化varA对象。称为A和C类的构造函数,但是varA只是一个A对象。我将varA的地址投放到C*类型,然后尝试调用其f()函数,但它打印了A类的f()功能,因此我推断出它是使用早期的绑定机制来调用它。我认为,如果我称之为派生类的构造函数,例如这种情况,如果我称之为基本构造函数,我会获得相同的对象。我认为唯一的区别是调用其他构造函数。我的假设是正确的还是还有其他区别?

切片的经典示例。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!