M a*_*a D 1 c++ oop inheritance constructor initialization
这是我的代码,您也可以从http://cpp.sh/5lsds运行它
#include "iostream"
using namespace std;
class X{
private:
int c;
public:
X(){}
X(int b){
c = 11;
}
int getC();
};
class Z:public X{
public:
Z(int n){
X(23);
}
};
int main()
{
Z z(1);
cout<<z.getC()<<endl;
return 0;
}
int X::getC(){
return c;
}
Run Code Online (Sandbox Code Playgroud)
我需要有X(){}行,因为子构造函数需要调用父默认构造函数.
如果从http://cpp.sh/5lsds运行该程序,您可以看到输出是0我期望的那样11.由于Z构造X函数使用int参数调用构造函数,并将c值设置为11但输出为0.
你应该使用成员初始化列表,
在类的构造函数的定义中,成员初始化列表指定直接和虚拟基础子对象和非静态数据成员的初始化程序.
例如
Z(int n) : X(23) {}
Run Code Online (Sandbox Code Playgroud)
我需要有
X(){}行,因为子构造函数需要调用父默认构造函数.
使用成员初始化列表,不再需要它(在此代码示例中).
对于X(23);在构造函数体,你只是建立一个临时的X,这无关与基子对象X的Z; 然后将使用X(ie X::X())的默认构造函数.即它等同于:
Z(int n) : X() { // initialize the base suboject X via X::X()
X(23); // create an unnamed temporary via X::X(int)
}
Run Code Online (Sandbox Code Playgroud)