通过复制派生类的另一个对象,在创建派生类的对象时调用基类的复制构造函数

时间:2011-09-01 10:00:52

标签: c++ inheritance language-design copy-constructor

class base {};
class der : public base{};


der d1;
der d2(d1);

此语句调用类base的默认构造函数,然后复制claas der的构造函数。 我的问题是为什么C ++没有提供调用基类复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象

4 个答案:

答案 0 :(得分:6)

短版

  

此语句调用类base的默认构造函数,然后复制claas der。

的构造函数

不,它没有。

  

我的问题是为什么C ++没有提供调用基类复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象

确实如此。


长(呃)版本

我不知道你是怎么得出结论的,在构造d2期间调用了基本的默认构造函数,但事实并非如此。正如您所期望的那样,调用了合成的基本拷贝构造函数

这是really easy to test

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;
}