Передать параметры при создании экземпляра дочернего класса mql
22 января 2021 г. 6:22
Если в базовом классе есть конструктор с параметрами, то при создании дочернего класса нужно добавить конструктор с передачей параметров в базовый класс.
Для наглядности сначала покажу пример без использования параметров в конструкторе:
class Base { public: void Base(){ Print("Base: constructor is called"); }; }; class Child : public Base { public: void Child(){ Print("Child: constructor is called"); }; };
В терминале во вкладке "Терминал \ Эксперты" мы видим результат выполнения кода:
2021.01.22 13:07:04.756 TestBot EURCHF,H1: Child: constructor is called 2021.01.22 13:07:04.756 TestBot EURCHF,H1: Base: constructor is called
Видно, что сначала выполнился код базового конструктора, а затем дочернего.
Если честно, меня удивило, что при инициализации объекта child
конструктор класса Child
не переопределил конструктор класса Base
. Разным кодом я пытался переопределить базовый класс, но увы, у меня не получилось. Если кто знает, как это делается, напишите в комментариях - буду признателен!
Чтобы использовать дочерний класс нужно, во-первых использовать конструктор. Без него не будет работать, например:
class Base { public: void Base(string text) { Print("Base: constructor is called. text = " + text); }; }; class Child : public Base { public: void func() { Print("Child: func() is called"); }; }; Child child("xxx");
Возникнет ошибка: 'Child' - wrong parameters count
.
А во-вторых, при описании конструктора дочернего класса использовать следующую конструкцию: void Child(string text) : Base(text) {...}
:
class Base { public: void Base(string text) { Print("Base: constructor is called. text = " + text); }; }; class Child : public Base { public: void Child(string text) : Base(text){}; void func() { Print("Child: func() is called"); }; }; Child child("xxx"); child.func() // Результат выполнения кода: Base: constructor is called. text = xxx Child: func() is called
Если при создании дочернего объекта нужно выполнить какой-то код, то его нужно поместить в фигурные скобки в теле конструктора:
class Base { public: void Base(string text) { Print("Base: constructor is called. text = " + text); }; }; class Child : public Base { public: void Child(string text) : Base(text){ Print("Child: constructor is called. text = " + text); }; void func() { Print("Child: func() is called"); }; }; Child child("xxx"); child.func() // Результат выполнения кода: Base: constructor is called. text = xxx Child: constructor is called. text = xxx Child: func() is called
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0