我的知识有点生疏..。我第一次尝试在容器中使用多态性。
class car {
public: std::string color;
public: virtual void foo (void) = 0;
public: virtual ~car (void){}
};
class truck : public car {
public: int tonnage;
public: virtual void foo (void) {}
};
// expect for subclasses of car..。
truck *t = new truck ();
t->color="white";
t->tonnage=32;
std::list <car *> lst; // for any kind of car
lst.push_back (t);
printf ("\n1: %s", typeid (t).name ());
printf ("\n2: %s", typeid (lst.front()).name());我希望能看到
1: P3van
2: P3van但它是
1: P3van
2: P3car用容器是不可能的,还是有什么问题?我需要的是子类,而不是父类。据我所知,切片并不是指针的问题。谢谢你帮忙!
EDIT1:
我添加了虚拟函数。但也是同样的结果。
EDIT2:
我想介绍一下打字信息。否则,我可以将id成员放入基类,但我认为这是可能的(例如,动态类型/强制转换)。
发布于 2016-10-20 18:48:28
C++将多态类定义为至少有一个虚拟函数的类。除非typeid的参数是多态类,否则它不会做任何特殊的事情。因此,首先,向car添加一个虚拟析构函数
class car {
public:
virtual ~car() {}
std::string color;
};此外,typeid不对指针执行多形性操作,只对对象/引用执行操作。试一试
printf ("\n1: %s", typeid (*t).name ());
printf ("\n2: %s", typeid (*lst.front()).name());发布于 2016-10-20 18:16:08
typeid()不是car类的成员函数。所以多态性不适用于这里。而不是类型(XXX).name(),调用XXX->(),您将看到所期望的结果。
或者,如果不是要查找的指针的类型,而是对象的类型,则应该在对象上调用type it,而不是指针。
代替类型(T),调用类型(*t)。
https://stackoverflow.com/questions/40161600
复制相似问题