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

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

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

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

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

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

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

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

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

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