从基类的堆栈中调用派生类实例

时间:2018-03-02 07:53:01

标签: c++

假设我有一个基础结构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();

1 个答案:

答案 0 :(得分:2)

当您执行actions.push(a1);Action element = actions.top();时,您实际上正在存储并获取要存储的实际Action副本。要利用virtual functions,您需要通过指针或参考来访问成员。

在您的示例中,您需要:

  1. 存储指向您的操作的指针

    stack<Action*> actions;
    A1 a1;
    A2 a2;
    actions.push(&a1);
    actions.push(&a2);
    
  2. 获取这些指针并通过它们访问print

    while(!actions.empty())
    {
        Action* element = actions.top();
        element->print();
        actions.pop();
    }
    

    Live example

  3. 最好使用像std::unique_ptr这样的智能指针而不是原始指针,但为了简单起见,我省略了细节。