如何将复制构造函数与基类一起使用

How to use a copy constructor with a base class?

本文关键字:基类 一起 构造函数 复制      更新时间:2023-10-16

我对基类和复制构造函数感到困惑。

假设我有一个班级

class A {
    public:
    A(int m) : m(m) { return; }
    virtual ~A() { return; }
    int m;
}

以及一个继承这个的类

class B : public A {
    public:
    B(int n, int m) : A(m), n(n) { return; }
    vitual ~B() { return; }
    int n;
}

当我复制class B时,如何确保class A中的m值也被复制?

默认的复制构造函数将复制所有成员变量,无论它们位于基类还是派生类中。

如果您为类B创建自己的复制构造函数,则需要自己复制类A成员,或者最好在初始值设定项列表中使用类A的复制构造函数。

class B : public A {
    public:
    // ...
    B(const B & b) : A(b), n(b.n) {}
    // ...
};

在派生副本构造函数之前,将自动调用基本副本构造函数。这与常规构造函数相同。(更准确地说,在派生构造函数继续之前,派生初始化列表会调用基构造函数)。在您的情况下,默认的复制构造函数就足够了。

但是,请注意不要将B复制到a中(搜索对象拼接)。

此代码是您的代码,只是复制构造函数添加了一个类:

#include <iostream>
using namespace std;
struct Int
{
    Int ()
    {
    }
    Int(const Int&)
    {
        cout<< "Int copied" "n";
    }
};

class A
{
    Int m;
public:
    A(Int m) : m(m)
    {
    }
    virtual ~A()
    {
    }
};
class B : public A
{
    Int n;
public:
    B(Int n, Int m) : A(m), n(n)
    {
    }

    virtual ~B()
    {
    }
};
void f(B)
{
}
int main()
{
   Int m,n;
   B b(m,n);
   cout<< "n" "start:" "n";
   f(b);
   cout<< "end";
}

Ubuntu Qt Creator Output表示两者都是复制的。

可以认为A中有一个类型为B的隐藏成员,该隐藏成员可以像上面的程序中那样初始化或复制为普通成员,使用:

B(Int n, Int m) : A(m), n(n)

您不应该从构造函数/析构函数返回,甚至不应该从void返回。