class Base
{
public:
int i;
Base()
{
cout<<"Base Constructor"<<endl;
}
Base (Base& b)
{
cout<<"Base Copy Constructor"<<endl;
i = b.i;
}
~Base()
{
cout<<"Base Destructor"<<endl;
}
void val()
{
cout<<"i: "<< i<<endl;
}
};
class Derived: public Base
{
public:
int i;
Derived()
{
Base::i = 5;
cout<<"Derived Constructor"<<endl;
}
/*Derived (Derived& d)
{
cout<<"Derived copy Constructor"<<endl;
i = d.i;
}*/
~Derived()
{
cout<<"Derived Destructor"<<endl;
}
void val()
{
cout<<"i: "<< i<<endl;
Base::val();
}
};
Run Code Online (Sandbox Code Playgroud)
如果我做Derived d1; 派生d2 = d1; 调用base的复制构造函数并调用derived的默认复制构造函数.
但是,如果我从派生的复制构造函数中删除注释,则不会调用基本复制构造函数.这有什么具体原因吗?提前致谢.
tst*_*ter 16
我认为你必须显式调用基本拷贝构造函数:
Derived (Derived& d) : Base(d)
{
cout<<"Derived copy Constructor"<<endl;
i = d.i;
}
Run Code Online (Sandbox Code Playgroud)
Kir*_*sky 13
如果您想阅读实际规则,请参阅C++标准12.8/8:
类X的隐式定义的复制构造函数执行其子对象的成员副本.复制的顺序与用户定义的构造函数中基数和成员的初始化顺序相同(见12.6.2).每个子对象都以适合其类型的方式复制:
- 如果子对象是类类型,则使用该类的复制构造函数;
- 如果子对象是一个数组,则以适合于元素类型的方式复制每个元素;
- 如果子对象是标量类型,则使用内置赋值运算符.
明确定义复制构造函数时,应该显式调用基类的复制c-tor.