复制构造函数和基类C ++

时间:2009-09-30 19:22:51

标签: c++ serialization constructor copy

我希望能够从基类初始化派生类,如下所示:

class X {
   public:
   X() : m(3) {}
   int m;
};

class Y : public X {
   public: 
   Y() {}
   Y(const & X a)  : X(a) {}
};

这样做有什么危险或不寻常的吗?我想要它,因为我正在反序列化一些我不能立即知道的类型的对象,所以我基本上想要使用X作为一些临时存储,而我正在读取整个序列化文件,然后创建我的Y对象(和W,X,Y objs,取决于数据)之后使用该数据。也许有一种我更容易丢失的方式。

谢谢!

2 个答案:

答案 0 :(得分:5)

只要X具有正确的复制ctor(自动生成与否)并且将Y的其他成员(如果有)设置为适当的默认值,就应该没有问题。

我假设Y会有一些setter方法来更新Y以及序列化流中后续信息的结果吗?

另请注意,Y构造函数中的X应该有一个看起来更像的签名:

Y( X const & a)   // the X was in an invalid place before

答案 1 :(得分:3)

  

这样做有什么危险或不寻常的吗?

如果Y有自己的任何数据成员(不在基类中),则不会初始化它们。

class Y : public X {
   public: 
   Y() {}
   Y(const X& a) : X(a)
   {
     //'n' hasn't been initialized!
   }
   int n;
};

如果Y没有自己的任何数据成员,为什么它是一个独特的子类?它是否可以覆盖X的虚拟成员?

如果X应该像这样被子类化,那么它应该是一个带有纯虚方法的抽象类,它不可能自己实例化。

而不是你所建议的,考虑包容而不是子类化(Y“有一个”而不是Y“是一个”X“):

class IAnInterface
{
public:
  virtual ~IAnInterface();
  virtual void SomeMethod() = 0;
  virtual void AnotherMethod() = 0;
}

class Y : public IAnInterface {
  public: 
  Y(const X& x) : m_x(x)
  {
  }
  X m_x;
  virtual void SomeMethod() { ... an implementation ... }
  virtual void AnotherMethod() { ... another implementation ... }
};