模型类/子类,其中子类类型在C++中先验未知



我正在使用C++。 Vehicle是一个类,CarTruckShip是它的子类。

想象一下,我有一个包含有关Vehicle对象信息的文件file.vechicle,该文件的第一个信息是车辆是CarTruck还是Ship

文件的格式会根据文件描述的车辆而相应更改。

我在Vehicle中定义了一个静态方法,该方法将.vehicle文件作为输入,然后它确定该文件是描述CarTruck还是Ship,因此它在相应的类中调用私有方法来从文件构建对象。最后,静态方法返回正确的对象,因此Car文件是否描述汽车,依此类推。

是否可以在不引入静态方法的情况下实现相同的目标,因此只需调用 Vehicle 的构造函数并Vehicle根据文件的内容更改其标识?

不,C++对象不会更改其最派生的类型(这种行为可以或多或少地轻松模拟,像往常一样,需要一些性能成本,并且以以下约定为代价(。您正在使用某种工厂模式,在C++(和许多其他语言(中,其刻板型实现是通过返回盒装多态类型的静态方法完成的。

一种典型的解决方案是让 Vehicle 类型在内部封装具体实现。这甚至允许构建它:

class Carrier {
public:
    virtual void go() = 0;
    virtual ~Carrier() {}
};
class Car: public Carrier;
class Ship: public Carrier;
struct Vehicle /* you can even add ': Carrier' here, just don't make Vehicle run on itself */
{
     Vehicle(std::string const &spec): impl(spec == "car"? new Car : new Ship) {}
     void go() { return impl->go(); }
private:
     std::unique_ptr<Carrier> impl;
};

最新更新