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