模型类/子类,其中子类类型在C ++中不是先验已知的

时间:2018-04-17 12:18:26

标签: c++ oop polymorphism

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

想象一下,我有一个文件file.vechicle,其中包含有关Vehicle对象的信息,此文件的第一个信息之一是车辆是Car,{{1或Truck

文件格式相应地改变了文件描述的车辆。

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

是否可以实现相同的功能,但不引入静态方法,因此只需调用Ship的构造函数并让Car根据文件内容更改其标识?

1 个答案:

答案 0 :(得分:1)

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

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