转换构造函数,基类作为参数?

时间:2012-01-20 09:20:02

标签: c++

如果Derived派生自Base,那么定义像这样的转换构造函数是否有意义?

Derived(const Base& b) : Base(b) {
    //...
}

Derived复制构造函数是否存在问题?

我会在这里指明我的意图。我有一个Base类和三个派生类。我有列表中存储的每个派生类的对象,每种类型一个。 然后我有一个文件,其中存储了一些对象,但作为基类。文件中的一行指示哪种类型的派生类对应。 我的代码应该在正确的列表中查找对象是否存在(使用从基类继承的==运算符)。 请告诉我是否有更好的解决方案。

2 个答案:

答案 0 :(得分:0)

我对你想要实现的目标感到有点困惑,但是将基类对象强制转换为派生类,这几乎肯定是一个坏主意。

如果你有一个派生类对象的集合存储为基类,你不需要“文件中的行”来识别它们实际上是哪种类型。只需在基类中定义一个虚函数(例如GetType()),并在每个派生类中以不同方式实现它。或者甚至更好,避免(if(obj.GetType()==)样式编程只有一个接口,并在每个派生类中提供不同的实现。派生类非常清楚它是什么,你的顶级代码可能不需要知道。

答案 1 :(得分:0)

底层问题的正确解决方案是工厂方法:std::shared_ptr<Base> ReadObject(std::istream&);。此方法可以从文件中读取“type”行并创建相应的类型对​​象。