我写这个小程序是为了测试我的理解力。我无法理解的是构造函数不是继承的,但是 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
构造函数的主体 一个
非默认构造函数调用(带有参数5
)作为创建临时对象的一部分- 临时对象超出范围并被销毁
B
构造函数主体退出
关于具有默认参数的 C++ 基类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46967573/