我希望能够从基类初始化派生类,如下所示:
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,取决于数据)之后使用该数据。也许有一种我更容易丢失的方式。
谢谢!
答案 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 ... }
};