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

conversion constructor, base class as a parameter?

本文关键字:参数 基类 构造函数 转换      更新时间:2023-10-16

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

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

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

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

我对您在这里试图实现的目标有点困惑,但将基类对象转换为派生类对象几乎肯定是个坏主意。

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

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