Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: выполнения функции класса наследник записанному в переменной класса ро
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
Ramozarti
Есть класс m1 и класс m2. m2 - наследник m1.

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

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

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

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

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


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

Есть ещё вариант с проверкой на тип класса и приведению к этому типу.
Вижу способ как сделать проверку - в специальной функции вернуть строку с именем класса. Но это гемморно т.к. классов будет много.
European
Цитата(Ramozarti @ 19:08:2008 - 21:46) *
Есть массив указателей на класс m1. В этом массиве записаны наследники класса m1.

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

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

Не может такого быть... Вы явно что-то не так делаете. Покажите код...
Ramozarti
Цитата(European @ 20:08:2008, 09:11 ) *
Не может такого быть... Вы явно что-то не так делаете. Покажите код...



CODE


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;




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

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

Как лучше реализовать этот цикл??
European
Конечно работать не будет, ведь метод calc не является виртуальным

Цитата(Ramozarti @ 20:08:2008 - 10:04) *
Как лучше реализовать этот цикл??

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

Да, и деструктор базового класа объявите виртуальным
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2009 IPS, Inc.