class base {};
class der : public base{};
der d1;
der d2(d1);
此语句调用类base的默认构造函数,然后复制claas der的构造函数。 我的问题是为什么C ++没有提供调用基类复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象
答案 0 :(得分:6)
此语句调用类base的默认构造函数,然后复制claas der。
的构造函数
不,它没有。
我的问题是为什么C ++没有提供调用基类复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象
确实如此。
我不知道你是怎么得出结论的,在构造d2
期间调用了基本的默认构造函数,但事实并非如此。正如您所期望的那样,调用了合成的基本拷贝构造函数。
struct base {
base() { cout << "*B"; }
base(base const& b) { cout << "!B"; }
~base() { cout << "~B"; }
};
struct der : base {};
int main() {
der d1;
der d2(d1);
}
// Output: *B!B~B~B
答案 1 :(得分:0)
此语句调用类base的默认构造函数,然后复制claas der。
的构造函数
不,不。
第一行调用类der
的默认构造,该构造调用类base
的默认构造函数。第二行调用类der
的复制构造函数,因为您正在将一个der
实例复制到另一个实例。
答案 2 :(得分:0)
编译器生成的拷贝构造函数将调用基类的拷贝构造函数。
您可能已为der
添加了用户定义的复制构造函数。在这种情况下,您必须显式调用基类的复制构造函数。
der::der(const der& other): base(other), ... {}
答案 3 :(得分:0)
派生类的复制构造函数调用基类的默认构造函数。
以下示例程序演示了相同的内容。
#include <iostream>
using namespace std;
class Base
{
public:
Base(){ cout<<"Base"<<endl; }
Base(int i){ cout<<"Base int "<<endl; }
Base(const Base& obj){ cout<<"Base CC"<<endl; }
};
class Derv : public Base
{
public:
Derv(){ cout<<"Derv"<<endl; }
Derv(int i){ cout<<"Derv int "<<endl; }
Derv(const Derv& obj){ cout<<"Derv CC"<<endl; }
};
int main()
{
Derv d1 = 2;
Derv d2 = d1; // Calls the copy constructor
return 0;
}