模型类/子类,其中子类类型在C+中是未知的+; 我使用C++。 车辆是一个类,汽车,卡车,船舶是其子类

模型类/子类,其中子类类型在C+中是未知的+; 我使用C++。 车辆是一个类,汽车,卡车,船舶是其子类,c++,oop,polymorphism,C++,Oop,Polymorphism,假设我有一个文件file.vechicle,其中包含有关车辆对象的信息,该文件的第一个信息是车辆是汽车、卡车还是船舶 文件的格式会相应地更改文件所描述的车辆 我在Vehicle中定义了一个静态方法,该方法将.Vehicle文件作为输入,然后确定该文件是描述汽车、卡车还是船舶,因此它调用相应类中的私有方法,从该文件构建对象。 最后,静态方法返回正确的对象,如果文件描述的是一辆车,那么返回一辆车,依此类推 有可能实现相同的事情,但不引入静态方法,所以简单调用“代码>车辆< /代码>的构造函数,并具有

假设我有一个文件
file.vechicle
,其中包含有关
车辆
对象的信息,该文件的第一个信息是车辆是
汽车
、卡车还是
船舶

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

我在
Vehicle
中定义了一个静态方法,该方法将
.Vehicle
文件作为输入,然后确定该文件是描述
汽车
、卡车还是
船舶
,因此它调用相应类中的私有方法,从该文件构建对象。 最后,静态方法返回正确的对象,如果文件描述的是一辆车,那么返回一辆车,依此类推


有可能实现相同的事情,但不引入静态方法,所以简单调用“代码>车辆< /代码>的构造函数,并具有<代码>车辆< /代码>相应地改变其身份到文件的内容?

,C++对象不会改变它们的最派生类型。(这种行为可以或多或少容易地模仿,比如一些性能成本,通常是遵循以下约定的价格)。您使用的是工厂模式的东西,在C++中(以及许多其他语言),它的常规实现是通过静态方法返回盒式多态类型来完成的。 一个典型的解决方案是
车辆
类型在内部封装具体实现。这甚至允许构建它:

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;
};
类载体{
公众:
虚拟void go()=0;
虚拟~Carrier(){}
};
第二类:公共交通工具;
船舶类别:公共承运人;
struct Vehicle/*您甚至可以在此处添加“:Carrier”,只是不要让车辆自行运行*/
{
车辆(标准::字符串常量和规格):impl(规格==“汽车”?新车:新船){}
void go(){return impl->go();}
私人:
std::唯一的\u ptr impl;
};