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

  • Автор темы Ramozarti
  • Дата начала
R

Ramozarti

Гость
#1
Есть класс m1 и класс m2. m2 - наследник m1.

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

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

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

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

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


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

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

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

Но если не делать приведение типов запускается метод calc для родителького класса.
Не может такого быть... Вы явно что-то не так делаете. Покажите код...
 
R

Ramozarti

Гость
#3
Не может такого быть... Вы явно что-то не так делаете. Покажите код...

[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.

Как лучше реализовать этот цикл??
 
04.09.2006
2 566
2
Минск
#4
Конечно работать не будет, ведь метод calc не является виртуальным

Как лучше реализовать этот цикл??
Не пойму в чём соль вопроса? Чем for не устраивает?

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