多态性适用于指针和引用,而不适用于对象实例。
在这种情况下,您的列表包含类型为car
的对象,而不是任何派生类型。当您插入honda
时,它将复制car
部分并忽略其余部分;这有时被称为切片。
对于多态,你可以使用指针列表:
list<car*> cars {new honda};
honda * h_ptr = dynamic_cast<honda*>(cars.back()); // should be a valid pointer
注:如果您分配使用new
在我的例子,记得无论是delete
它们,或存储智能指针(如std::unique_ptr<car>
),而比原始指针。您还需要一个虚拟析构函数才能使用基类指针删除对象。
您可以通过使基类抽象为来避免切片问题;如果它包含纯虚函数,那么你就不能仅实例化派生类型类型的对象,覆盖这些功能:如果你不真正想要的抽象接口
class car
{
virtual ~car() {}
virtual void do_something() = 0;
};
class honda : public car
{
void do_something() {}
};
(例如,如果你只访问派生类功能使用dynamic_cast
而不是通过虚函数),那么你可以使析构函数变为纯虚拟的;那么派生类将不必显式地覆盖任何东西。基类的析构函数仍然必须落实,由于语言的怪癖,即实现必须是类定义之外:
class car
{
virtual ~car() = 0;
};
inline car::~car() {}
class honda : public car {};
这是一个有点不寻常的做法,因为多态性通过虚拟函数通常更有效更方便。
没有办法正确做这个演员。你的清单是“汽车”列表。它没有(也不能)包含'honda's。 – 2012-07-05 11:32:04