复制构造函数和继承

Copy constructors and inheritance

本文关键字:继承 构造函数 复制      更新时间:2023-10-16

我有三个类。

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)

,在其中,我想根据它的类型(BC)初始化一个A*对象。这个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)

没有合适的构造函数

简单的解决方案是:

A* newA = A.isB ? new B(dynamic_cast<const B&>(someA)) : 
                  new C(dynamic_cast<const C&>(someA));
一个更简洁的解决方案是声明:
virtual A* clone() const = 0;

A中,然后创建newA只是:

A* newA = someA.clone();

每个派生类,写:

A* B::clone() const {
    return new B(*this);
}

但是要注意:如果您从B派生了一个类,那么您将需要重新实现clone,并且如果您不这样做,编译器将不会发出警告。