Есть 4 класса
Проверяю
Выводит Food. Ожидалось Burger.
Как решить проблему? Возможно я использую неправильный синтаксис виртуальных функций?
А функция Type() разве виртуальная?
Food *f = ...Тип переменной f есть "указатель на Food", назовём его "статическим типом" f.
Сама переменная может "указывать", то есть хранить handle объекта типа, производного от Food, назовём этот тип в тот момент времени, когда f хранит handle объекта этого типа, "динамическим типом" f.
В данном примере в интересующий момент времени "динамический тип" f есть Burger.
Вызов:
f.Type();есть вызов "статический тип"::Type(), - в данном случае Food::Type(), - если функция Type() НЕ виртуальная; либо "динамический тип"::Type(), - в данном случае Burger::Type(), - если функция виртуальная.
В данном примере функция Type() - НЕ виртуальная, поэтому происходит вызов Food::Type().
Думаю, теперь ответ на вопрос, как решить проблему, ясен.
А функция Type() разве виртуальная?
Опять нужна помощь. Есть такие классы
//------------------------------------------------ class CParameters { public: int IntItems[2]; }; //------------------------------------------------ class CFunction { protected: virtual CParameters* CreateParameters() { return NULL; } public: CFunction() { parameters = CreateParameters(); } CParameters* parameters; }; //------------------------------------------------ //------------------------------------------------ class CMyParameters : public CParameters { public: string StringItems[2]; }; //------------------------------------------------ class CMyFunction : public CFunction { protected: virtual CParameters* CreateParameters() { return new CMyParameters(); } public: CParameters* parameters; };
И код:
void OnStart() { CMyFunction* func = new CMyFunction(); CMyParameters* pars = func.parameters; pars.StringItems[0] = "test"; // тут вылетает т.к pars = NULL }
Вылетает на последней строчке.
Основная идея кода, чтобы пользователь мог насдледоваться от CFunction и переопределять всего-лишь один метод CreateParameters(). А вся логика будет выполняться в базовом классе, только с экземпляром, созданным CreateParameters().
Такое вообще реально?
Если добавить метод CFunction::ReturnParameters
virtual CParameters* ReturnParameters() { parameters = CreateParameters(); return parameters; }
и написать так
CMyFunction* func = new CMyFunction();
CMyParameters* pars2 = func.ReturnParameters();
CMyParameters* pars1 = func.parameters;
То в pars2 оказывается объект, а pars1 = NULL :) В с++ аналогично. Я в замешательстве...
Если добавить метод CFunction::ReturnParameters
и написать так
То в pars2 оказывается объект, а pars1 = NULL :) В с++ аналогично. Я в замешательстве...
Виртуальности в конструкторе нет.
Нельзя вызывать метод потомка из вызова конструирования родителя, т.к. потомок ещё не сконструирован (вот как то так примерно).
Виртуальности в конструкторе нет.
Нельзя вызывать метод потомка из вызова конструирования родителя, т.к. потомок ещё не сконструирован (вот как то так примерно).
Да, с этим я уже разобрался. Но что насчет функции ReturnParameters(), которая создает и возвращает parameters в то время, как последующий прямой доступ к parameters вернет NULL??
Сам же отвечаю: в CMyFunction повторно объявлены parameters. Поэтому так случается.
Вопрос решен :)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть 4 класса
Проверяю
Выводит Food. Ожидалось Burger.
Как решить проблему? Возможно я использую неправильный синтаксис виртуальных функций?