在子类的构造函数中调用超类的构造器两次
Calling the superclass' constuctor twice in the subclass' constructor
我有一个用户定义的类,比如A。我有另一个用户定义的 B 类,它公开扩展了 A。
当我定义 B 的构造函数时,我必须在 B 构造函数的成员初始值设定项列表中调用 A 的构造函数,否则编译器将调用默认构造函数。
class A {
int a;
public:
A(int x = 0) {
a = x;
}
};
class B : public A {
int b;
public:
B(int x = 0) : A(2*x) {
b = x;
}
};
现在,我明白了这一切背后的逻辑。但是,我想知道的是当我这样做时会发生什么:
class A {
int a;
public:
A(int x = 0) {
a = x;
}
};
class B : public A {
int b;
public:
B(int x = 0) {
A(2*x);
b = x;
}
};
我的意思是,我们都知道编译器会在 A 的默认构造函数进入 B 的构造函数主体之前调用它。现在,B 构造函数体的第一行是调用 A 的另一个构造函数(它接受参数)。那么,这会导致什么呢?每当创建子类的对象时,都会在此处调用超类的两个不同的构造函数。请解释一下发生了什么...是否将创建两个对象或什么。
这不会调用正在初始化的B
的A
子对象的构造函数。相反,它会创建并销毁类型 A
的临时对象。调用基子对象的构造函数的唯一方法是通过初始化器列表,如第一个示例所示。
现在,B 构造函数体的第一行是调用 A 的另一个构造函数(它接受参数)。那么,这会导致什么呢?
它构造一个临时A
并立即丢弃临时对象。该调用与初始化B
的A
部分无关。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 为什么参数在构造 std::thread 时移动两次
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- C++:链接库两次,全局构造函数运行两次吗?
- 重载运算符 new(),为什么构造函数被调用两次?
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 为什么这个构造函数被调用两次
- 为什么在此代码代码段中将复制构造函数两次称为两次
- 为什么在C 中超载邮政增量运算符两次调用构造函数
- 为什么静态thread_local对象在C++构造两次
- 构造函数在不同线程中的静态单例类上调用两次
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- 为什么将复制构造器称为25次,而插入循环仅迭代10次
- 我如何在C 中两次使用ifstream上的迭代器
- 两次构造对象
- 在子类的构造函数中调用超类的构造器两次
- std::make_shared在VS2012中进行了两次构造函数调用