在派生类之间复制共享变量(浅拷贝就足够了)

时间:2017-03-10 12:11:34

标签: c++ inheritance dynamic-cast downcast

所以,我有一个Base类和两个Derived类,我们称之为Deriv1和Deriv2。

让我们说Base类有很多(受保护或公共)变量,当然这些变量也包含在Deriv1和Deriv2中。

现在让我们说我有一个Deriv1的实例。 Base类中的数十亿个变量用各个值填充。现在我想使用这些共享值创建一个Deriv2实例。

现在我的问题:如何将Deriv1的Base类部分复制到Deriv2 而不用编写一个分配运算符,我必须手动列出所有数十亿的Base类变量(每次我在Base类中更改内容时更新它?这样做有什么办法,不管是不是很脏?

我最初的想法是:

Deriv1 drv1;

... // actions regarding drv1, like changing variables

Base tempbase = drv1; // slicing off the non-base parts of Deriv1
Deriv2 drv2 = *dynamic_cast<Deriv2*>(&tempbase); // downcast

这不起作用。它确实编译了(我必须为它添加一个虚拟虚拟函数),但是在运行时,它说'#34;访问违规&#34;,所以我猜dynamic_cast返回一个空指针。我尝试在dynamic_cast中使用引用而不是指针,这也没有用。

2 个答案:

答案 0 :(得分:2)

您可以使用基类的(隐式定义的)复制构造函数,它通过值复制所有成员(甚至是私有成员)(即浅复制)。您也可以为基类定义一个显式的复制构造函数,但在您的情况下似乎没有必要。 请参阅以下示例:

class A  {
  public:
    A (int x, int y) : x(x), y(y) { };
    // implicitly defined: A (const A &anA) : x(anA.x), y(anA.y) {  }
  private:
    int x, y;
};

class B : public A {
  public:
    int z;
    B(const A&anA) : A(anA) { }
    B(const B&b, int z) : A(b), z(z) { }
};

class C : public A {
  public:
    int anythingElse;
    C(const A&anA) : A(anA) { }
};


int main()
{
    A a(10,20);  // a.x = 10; a.y = 20
    B b1(a);     // b1.x = 10, b1.y = 20, b1.z = undefined.
    B b2(b1,30); // b2.x = 10, b2.y = 20, b2.z = 30.
    C c(b1);     // c.x = 10; c.y = 20; c.anythingElse = undefined

    return 0;
}

答案 1 :(得分:0)

使用static_cast而不是dynamic_cast将解决这个问题。