• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Ramozarti

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

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

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

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

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

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


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

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

European

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

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

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

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.

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

European

Конечно работать не будет, ведь метод calc не является виртуальным

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!