首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL::容器

STL::容器
EN

Stack Overflow用户
提问于 2016-10-20 18:11:30
回答 2查看 377关注 0票数 0

我的知识有点生疏..。我第一次尝试在容器中使用多态性。

代码语言:javascript
复制
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

..。

代码语言:javascript
复制
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());

我希望能看到

代码语言:javascript
复制
1:    P3van
2:    P3van

但它是

代码语言:javascript
复制
1:    P3van
2:    P3car

用容器是不可能的,还是有什么问题?我需要的是子类,而不是父类。据我所知,切片并不是指针的问题。谢谢你帮忙!

EDIT1:

我添加了虚拟函数。但也是同样的结果。

EDIT2:

我想介绍一下打字信息。否则,我可以将id成员放入基类,但我认为这是可能的(例如,动态类型/强制转换)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-20 18:48:28

C++将多态类定义为至少有一个虚拟函数的类。除非typeid的参数是多态类,否则它不会做任何特殊的事情。因此,首先,向car添加一个虚拟析构函数

代码语言:javascript
复制
class car {
  public:
    virtual ~car() {}
    std::string color;
};

此外,typeid不对指针执行多形性操作,只对对象/引用执行操作。试一试

代码语言:javascript
复制
printf ("\n1:    %s", typeid (*t).name ());
printf ("\n2:    %s", typeid (*lst.front()).name());
票数 2
EN

Stack Overflow用户

发布于 2016-10-20 18:16:08

typeid()不是car类的成员函数。所以多态性不适用于这里。而不是类型(XXX).name(),调用XXX->(),您将看到所期望的结果。

或者,如果不是要查找的指针的类型,而是对象的类型,则应该在对象上调用type it,而不是指针。

代替类型(T),调用类型(*t)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40161600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档