在C (继承的类)中调用的构造函数

Constructors calling in c++ (inherited classes)

本文关键字:调用 构造函数 继承      更新时间:2023-10-16
#include <iostream>
class A
{
public:
  A()  { std::cout << "A's constructor calledn"; }
};
class B
{
public:
  B()  { std::cout << "B's constructor calledn"; }
};
class C: public B, public A  // Note the order
{
public:
  C()  { std::cout << "C's constructor calledn"; }
};
int main()
{
    C c;
    return 0;
}

当创建C的新实例时,为什么要调用类AB的构造函数?

输出是

B的构造函数称为A的构造函数称为C的构造函数称为

c c均来自A和B-因此,在可以执行C的构造函数之前,必须完成A和B的构造函数。如果不是这种情况,那么C构造函数将无法依靠其基础类提供的任何内容。

例如,假设一个包含从其构造函数中数据库创建和提交的项目列表。所有一个实例都可以依靠列表完成,因为必须在实例可用于其余代码之前完成构造函数。但是c也是一个A-它以与"福特"也是"汽车"一样的方式衍生而来的 - 因此它很可能想要访问该列表。当您构造一个实例时,基类构造函数会在派生类之前自动调用,以确保在派生的构造函数启动时一切准备就绪。

例如,稍微更改代码:

class A
{
public:
A() { cout << "A's constructor called" << endl; }
};
class B: public A
{
public:
B() { cout << "B's constructor called" << endl; }
};
class C: public B
{
public:
C() { cout << "C's constructor called" << endl; }
};
int main()
{
C c;
return 0;
}

您将得到:

A的构造函数称为B的构造函数称为C的构造函数称为

因为在执行派生的构造仪之前,基类构造函数都已完成。

为什么不这样做?C分别包含BA的零件,也需要构造这些零件。构造函数是执行此角色的功能。

kanishk tanwar的答案有更多细节,但是我还是写了这篇文章,所以这是一个非常哨子的停止之旅,说明为什么会回答您的问题:

为了确保正确初始化类的实例,始终调用基本类型的构造函数。如果您不指定要调用哪个构造函数(C的构造函数的语法:C() : B(), A()(,则使用默认构造函数。由于派生的类建立在基类上,因此必须先构建基类。

在您的情况下,您已指定了默认构造函数的内容,因此,这是实例化C的代码。