也许我误解了继承在这里的工作原理,但这是我的问题:
我有一个 Option 类,以及一个从它派生的 RoomOption 类。我有另一个 Room 类,它包含一个shared_ptrs 向量。在 main 中,我向该向量添加了 RoomOption。然后,使用 typeid() 检查类型,它告诉我它是一个选项。从我读到的内容来看, typeid 应该返回派生类型,并且 shared_ptrs 不会导致切片,所以我不确定我做错了什么。
这是代码:
Room.h:
vector<shared_ptr<Option> > options;
void addOption(shared_ptr<Option>);
shared_ptr<Option> getOption(int);
房间.cpp:
void Room::addOption(shared_ptr<Option> option){
options.push_back(option);
}
shared_ptr<Option> Room::getOption(int i){
return options[i];
}
main:
shared_ptr<Room> outside(new Room(0, "", ""));
outside->addOption(shared_ptr<RoomOption>(new RoomOption(0, "Go inside", hallway)));
cout<<typeid(player->getRoom()->getOption(0)).name().get()<<endl;
//This line prints "class std::tr1::shared_ptr<class Option>
我想到,也许在添加或获取选项时,由于返回/参数类型,RoomOption 被转换为选项。如果是这种情况,那么我应该如何存储不止一种类型的向量?还是我把这一切都搞错了? =\
The typeid
对于多态类型(对于具有至少一个虚函数的类)和非多态类型,工作方式不同:
在你的例子中,你实际上有一个多态类Option
, but shared_ptr<Option>
itsef 根本不是多态的。它基本上是一个装有Option*
。绝对有no之间的继承关系Option
and shared_ptr<Option>
.
如果要获取真实类型,首先需要使用以下命令从其容器中提取真实指针Option* shared_ptr<Option>::get()
:
Option * myPtr = player->getRoom()->getOption(0).get();
cout << typeid(*myPtr).name(); << endl;
或者(这是完全相同的事情):
Option& myPtr = *player->getRoom()->getOption(0);
cout << typeid(myPtr).name(); << endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)