代码之家  ›  专栏  ›  技术社区  ›  Nisba

C中子类类型未知的模型类/子类++

  •  1
  • Nisba  · 技术社区  · 6 年前

    我正在使用C++。 Vehicle 是一个类 Car ,则, Truck ,则, Ship 是其子类。

    想象一下,我有一个文件 file.vechicle 包含有关 交通工具 对象,此文件的第一个信息之一是车辆是否为 汽车 A. 卡车 或a

    文件的格式会相应地更改文件所描述的车辆。

    我在中定义了一个静态方法 交通工具 它把一个 .vehicle 文件,然后确定该文件是否描述 汽车 A. 卡车 或a 因此它在相应的类中调用一个私有方法来从文件构建对象。 最后,静态方法返回正确的对象,因此 汽车 如果文件描述的是一辆汽车,等等。

    如果不引入静态方法,那么只需调用 交通工具 并且拥有 交通工具 是否根据文件内容相应更改其标识?

    1 回复  |  直到 6 年前
        1
  •  1
  •   bipll    6 年前

    不,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;
    };