Странный полиморфизм - PullRequest
0 голосов
/ 31 июля 2011

Я пытаюсь сделать какой-то странный полиморфизм на C ++:

У меня есть два дерева классов:

Состояние <- Stage <- Stage_1, Stage_2, Stage_3 </p>

Action <- ActionState <- ActionState_Clear, ActionState_Begin, ActionState _ [...] </p>

Я хочу определить некоторые методы в Stage_1, которые получают Action в качестве параметра:

State 
{
    virtual void exec_action(Action *tAct)
    {
        std:cout << "NOT IMPLEMENTED" << endl;
    };
}

Stage_1 
{
    virtual void exec_action(ActionStage_Clear *tAct)
    {
        std::cout << "ACTION STAGE CLEAR" << endl;
    }

    virtual void exec_action(ActionStage_Begin *tAct)
    {
        std::cout << "ACTION STAGE BEGIN" << endl;
    }
}

Action *pAct = new ActionStage_Clear();
State* pSta = new Stage_1();

**pSta->exec_action(pAct);**

Я бы хотел, чтобы на экране появилось сообщение «ДЕЙСТВИЕ СТАДИИ ДЕЙСТВИЯ», ​​но на нем показано «НЕ РЕАЛИЗОВАНО».Это - я думаю - потому что нет никакой реализации exec_action (Action *) (хотя есть некоторые для его классов сына).

РЕДАКТИРОВАТЬ: я покажу вам небольшую часть диаграммы:У меня есть этап (ы) и действие (я).У меня будет ptr для Stage_1, 2 .. и ptr для Action_1, 2 ... Я хочу позвонить Stage_n-> exec_action (Action_n) , и это должно выполнить код сына: Action_1:: exec_action (Действие_1).(если он не реализован, он должен вызвать Action :: exec_action (Action)).

Design Вопрос

Как это исправить?Есть ли другой способ заставить его работать?

Спасибо, прости мой английский.

Ответы [ 2 ]

2 голосов
/ 31 июля 2011

Вы хотите двойная отправка здесь. Виртуальные функции напрямую предоставляют только одну. Один хороший пример двойной отправки - Шаблон посетителя , который может быть непосредственно применим к вашей задаче.

1 голос
/ 31 июля 2011

Вы можете переопределить только в своих базовых классах контравариантно : тип аргумента в методе производного класса должен быть меньше производного , чем в базовом классе.

В противном случае (как в вашем случае) вы просто пишете другую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...