我有这些课程:
首先:
class C
{
public:
C(const C& c):_s(c._s){}
c():_s(""){}
string _s;
}
第二
class C2: public C
{
public:
C2(const C2 & c2):_i(c2.i){}
C2():_i(0){}
int _i;
}
主:
int main()
{
C2 c2;
C2._s="hello";
c2._i=42;
C2 c3(c2);
cout<<c3._s<<" "<<c3._i<<endl;
}
,输出为42.我的问题是,为什么输出42?始终在派生构造函数之前调用基础构造函数,因此这一行:
C2 c3(c2);
应该调用C
的拷贝构造函数,并且应该复制“hello”,这意味着输出应该是hello。我在这里错过了什么?
答案 0 :(得分:4)
原因是
C2(const C2 & c2):_i(c2.i){}
不会将_s
初始化为c2
中存储的值,因为除非另有说明,否则将调用基类的默认(无参数)构造函数,因此_s
也会使用其默认值进行初始化构造函数,而不是复制构造函数。
特别是在您的情况下C2::(const C2&)
调用C::C()
并调用string::string()
。
您必须显式调用正确的基础构造函数:
C2(const C2 & c2) :
C( c2 ),
_i(c2.i)
{
}
答案 1 :(得分:1)
除了拼写错误(字符串s-&gt;字符串_s)之外,派生类的复制构造函数应该调用基类的构造函数
即
C2(const C2 & c2):C(c2), _i(c2.i){}
顺便说一句 - 与变量类型名称相似的
,问题会更容易答案 2 :(得分:1)
调用对象的复制构造函数。默认(编译器 生成)复制构造函数为每个成员调用复制构造函数, 然后是每个基类的复制构造函数。复制构造函数 你写的完全是你写的,不多也不少。大多数 时间,用户定义的复制构造函数应该从副本开始 建立基地:
C2::C2( C2 const& other )
: C( other )
, _i( other._i )
{
}
然而,有一些例外,有些时候你不想要 复制基地。
答案 3 :(得分:0)
是的,在派生类之前调用基类,调用WHICH基类构造函数但是由派生类规范决定。