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

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

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

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

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

最佳答案

不,C++对象不会更改其大多数派生类型(可以像往常一样以某种性能代价以及遵循以下约定的代价来或多或少地模拟这种行为)。您使用的是Factory模式,在C++(和许多其他语言)中,其原型(prototype)实现是通过返回盒装多态类型的静态方法完成的。

一种典型的解决方案是让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;
};

关于c++ - 在C++中先验未知子类类型的模型类/子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49877940/

10-11 22:09