выполнения функции класса наследник записанному в переменной класса ро

Тема в разделе "Общие вопросы по С и С++", создана пользователем Ramozarti, 19 авг 2008.

  1. Ramozarti

    Ramozarti Гость

    Есть класс m1 и класс m2. m2 - наследник m1.

    В m1 есть функция calc которая переопределена в классе m2;

    Есть другие наследники класса m1.

    Есть массив указателей на класс m1. В этом массиве записаны наследники класса m1.

    Есть задача в цикле вызвать метод calc для всех классов наследиков. Как это сделать?

    Но если не делать приведение типов запускается метод calc для родителького класса.


    Вариант с указателем на член класса работать скорей всего не будет, т.к. все равно будет вызван метод родительского класса. Где то читал что это можно обойти но это видится сложным.

    Есть ещё вариант с проверкой на тип класса и приведению к этому типу.
    Вижу способ как сделать проверку - в специальной функции вернуть строку с именем класса. Но это гемморно т.к. классов будет много.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Не может такого быть... Вы явно что-то не так делаете. Покажите код...
     
  3. Ramozarti

    Ramozarti Гость


    [codebox]

    class calculation { - это класс родитель
    protected:
    TPanel * panel;
    // форма ввода
    TformEnter * form;
    // форма вывода
    TformResult * formRes;


    calculation ** sub_calcs; // вложенные расчёты
    int index; // индекс вложенного расчёта
    int total; // число вложенные расчётов
    bool is_sub_items; // существуют ли вложенные расчёты
    bool go_back; // при переключении на последний расчёт

    public:
    calculations * calcs;
    AnsiString report;

    calculation(TPanel * ppanel, calculations * pcalcs);
    ~calculation();
    void getData(void);
    void calc(void); - это и есть нужный метод
    void makeReport(void);
    bool showEnterForm(bool next = true);
    bool showResultForm(bool next = true);
    };


    class calcCeha: public calculation { - это класс наследник
    public:
    calcCeha(TPanel *ppanel, calculations * pcalcs);
    bool showEnterForm(bool next = true);
    void calc(void);
    };


    void calculation::calc(void) {
    ShowMessage("Test");
    }

    void calcCeha::calc(void) {
    ShowMessage("1");
    }




    calculation * c = new calcCeha(panelRight, NULL);
    c->calc();
    delete c;


    [/codebox]

    в этом случае произойдёт вызов метода calc родительского класса. Возникнет окошко с текстом Тest
    в программе будет использоваться массив типа calculation *. А в этом массиве будут записаны самые разные наследники класса calculation.

    В цикле для них необходимо вызвать метод calc.

    Как лучше реализовать этот цикл??
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Конечно работать не будет, ведь метод calc не является виртуальным

    Не пойму в чём соль вопроса? Чем for не устраивает?

    Да, и деструктор базового класа объявите виртуальным
     
Загрузка...

Поделиться этой страницей