在C (继承的类)中调用的构造函数
Constructors calling in c++ (inherited classes)
#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
的新实例时,为什么要调用类A
和B
的构造函数?
输出是
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
分别包含B
和A
的零件,也需要构造这些零件。构造函数是执行此角色的功能。
kanishk tanwar的答案有更多细节,但是我还是写了这篇文章,所以这是一个非常哨子的停止之旅,说明为什么会回答您的问题:
为了确保正确初始化类的实例,始终调用基本类型的构造函数。如果您不指定要调用哪个构造函数(C
的构造函数的语法:C() : B(), A()
(,则使用默认构造函数。由于派生的类建立在基类上,因此必须先构建基类。
在您的情况下,您已指定了默认构造函数的内容,因此,这是实例化C
的代码。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素