我有三节课。
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
最初可以是B
或C
如何使用复制构造函数执行此操作?我有这样的事情:
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)
没有合适的构造函数。
答案 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>