我写了这个小程序来测试我的理解。我理解困难的是构造函数没有被继承,但是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
但这只是为了理解。
答案 0 :(得分:4)
让我们看一下B
构造函数:
B() {
A(5);
}
在这里你实际上打电话&#34; A
构造函数两次。作为B
构造的一部分(其中&#34;默认&#34; A
构造函数被调用),以及在{{1>}构造函数中创建临时对象的一部分{1}}构造函数体。
序列为
B
构造函数名为B
默认构造函数,作为A
对象B
构造函数的正文B
非默认构造函数(带参数A
)作为创建临时对象的一部分5
构造函数的正文退出