复制构造函数和继承

时间:2016-10-27 08:28:35

标签: c++

我有三节课。

class A
{
private:
    int num;
//...
// THIS IS AN ABSTRACT CLASS (has a pure virtual function)
}

class B : public A
{
private:
    float fnum;
//...
}

class C : public A
{
private:
    double dnum;
    //...
}

现在,我有一个功能

foo(A& someA)

并且在其中我想根据其'A*B来初始化C对象。此A最初可以是BC

如何使用复制构造函数执行此操作?我有这样的事情:

A* newA = A.isB ? new B(someA) : new C(someA)

我已经添加了副本构造函数:

B(const B& b) : A(b) { fnum = b.fnum; }
C(const C& c) : A(c) { dnum = c.dnum; }

但这当然会在行中引发错误

A* newA = A.isB ? new B(someA) : new C(someA)

没有合适的构造函数。

1 个答案:

答案 0 :(得分:1)

简单的解决方案是:

A* newA = A.isB ? new B(dynamic_cast<const B&>(someA)) : 
                  new C(dynamic_cast<const C&>(someA));

更清洁的解决方案是声明:

virtual A* clone() const = 0;
<{1>}中的

,然后创建A只是:

newA

每个派生类,写:

A* newA = someA.clone();

要注意:如果从A* B::clone() const { return new B(*this); } 派生一个类,则需要重新实现B,如果不这样做,编译器将不会发出警告。< / p>