假设我有一个基础结构Action
:
struct Action
{
int type;
virtual void print() { }
}
2个派生结构A1, A2
:
struct A1 : Action
{
A1 : Action(0) { }
void print() { cout << "A1"; }
}
struct A2 : Action
{
A2 : Action(1) { }
void print() { cout << "A2"; }
}
然后在我的main函数中我有一个堆栈:
stack<Action> actions;
A1 a1;
A2 a2;
actions.push(a1);
actions.push(a2);
while(!actions.empty())
{
Action element = actions.top();
element.print();
actions.pop();
}
但是,print()
函数将始终调用基类print()
,而不是派生类。如何让它引用派生类?
在C#中,我理解有一个GetType()
函数,但是在c ++中有类似的东西吗?
编辑:具体来说,我正在寻找一种方法将类似基类的所有对象收集到一个容器中,这样我就可以迭代所有这些对象,而不会丢失派生类的信息。
(C#中)的某些内容:
if(element.getType() == typeof(A1))
((A1)element).print();
else if (element.getType() == typeof(A2))
((A2)element).print();
答案 0 :(得分:2)
当您执行actions.push(a1);
和Action element = actions.top();
时,您实际上正在存储并获取要存储的实际Action
的副本。要利用virtual functions
,您需要通过指针或参考来访问成员。
在您的示例中,您需要:
存储指向您的操作的指针
stack<Action*> actions;
A1 a1;
A2 a2;
actions.push(&a1);
actions.push(&a2);
获取这些指针并通过它们访问print
:
while(!actions.empty())
{
Action* element = actions.top();
element->print();
actions.pop();
}
最好使用像std::unique_ptr
这样的智能指针而不是原始指针,但为了简单起见,我省略了细节。