如何使用基类的复制构造函数?

时间:2013-08-02 14:25:47

标签: c++ copy-constructor

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

说我有一个班级

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时,如何确保同时复制m中的class A值?

4 个答案:

答案 0 :(得分:4)

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

如果为B类创建自己的复制构造函数,则需要自己复制A类成员,或者更好地在初始化列表中使用A类的复制构造函数。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

#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输出说两者都被复制了。

可以认为B中存在A类型的隐藏成员,并且可以将此隐藏成员初始化或复制为上述程序中的常规成员:

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

答案 3 :(得分:-1)

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