C++具有默认参数的基类构造函数
C++ base class constructor with default parameters
我写这个小程序来测试我的理解。我难以理解的是构造函数不是继承的,但是类 B 能够调用类 A 的构造函数!
#include <iostream>
using namespace std;
class A {
public:
A(int x = 2) { //Constructor A
num = x;
}
int getNum() {
return num;
}
protected:
int num;
};
class B: public A { //Constructor B
public:
B() {
A(5);
}
};
int main() {
A a(3); //create obj a with num = 3
B b; //create obj b
cout << a.getNum() << endl;
cout << b.getNum() << endl;
return 0;
}
输出为:
3
2
构造函数 A 的调用究竟做了什么?它没有使用传递的参数来初始化对象 b 的编号!
此外,如果我从类 A 的构造函数中删除默认值,则会出现编译错误:
no matching function for call to 'A::A()'
那么这里到底发生了什么?
我知道正确的方法是这样做:
class B: public A { //Constructor B
public:
B() : A(5) {
}
};
这给出了输出:
3
5
但这只是为了理解。
让我们看一下B
构造函数:
B() {
A(5);
}
在这里,您实际上"调用"了两次A
构造函数。一次作为B
构造的一部分(调用"默认"A
构造函数),一次作为在B
构造函数体内创建临时对象。
序列为
-
B
构造函数调用 -
A
作为B
对象初始化的一部分调用的默认构造函数 - 输入
B
构造函数的主体 -
A
非默认构造函数(带有参数5
)作为临时对象创建的一部分 - 临时对象超出范围并被销毁
- 构造函数的主体
B
退出
相关文章:
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在成员构造函数之后调用基类构造函数
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 如何在 C++ 中将参数传递给基类构造函数
- 将数据成员的指针传递给基类构造函数是否安全?
- 使用基类构造函数初始化儿童类
- 使用基类构造函数的子类构造函数的大纲定义
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否可以使用基类构造函数通过派生类将值初始化为基类私有成员?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 是否可以在运行时切换到不同的基类构造函数?
- 对基类构造函数的未定义引用
- 如何为基类构造函数中的每个子类执行特定任务
- 将类传递到基类构造函数的模板参数中?
- 如何在基类构造函数中使用派生类成员
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 使用相同的参数调用基类C++构造函数