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

Calling copy constructor of base class while creating object of derive class by copying another object of derive class

本文关键字:派生 复制 一个对象 创建 对象 构造函数 基类 调用      更新时间:2023-10-16
class base {};
class der : public base{};

der d1;
der d2(d1);

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

简短版本

此语句调用类基的默认构造函数,然后复制 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

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

不,它没有。

第一行调用类der的默认构造,调用类base的默认构造函数。第二行调用类 der 的复制构造函数,因为您要将一个der实例复制到另一个实例。

编译器生成的复制构造函数将调用基类的复制构造函数。

您可能已经为 der 添加了用户定义的复制构造函数。在这种情况下,必须显式调用基类的复制构造函数。

der::der(const der& other): base(other), ... {}

派生类的复制构造函数调用基类的默认构造函数。

下面的示例程序演示了相同的内容。

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