3

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

说我有课

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时,如何确保也复制了min 的值class A

4

4 回答 4

4

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

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

class B : public A {
    public:
    // ...
    B(const B & b) : A(b), n(b.n) {}
    // ...
};
于 2013-08-02T14:37:02.987 回答
1

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

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

于 2013-08-02T14:29:20.193 回答
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 Output 说两者都被复制了。

可以认为有一个带有 type Bin的隐藏成员A,这个隐藏成员可以像上面程序中的普通成员一样初始化或复制:

B(Int n, Int m) : A(m), n(n)
于 2013-08-02T14:42:58.717 回答
-1

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

于 2013-08-02T14:44:08.283 回答