ООП. Вопросы применения

 

Тема "ООП" вылилась в обмен мнениями типа "хорошо или не очень". Хотелось бы ответов на более приземлённые вопросы.

Вопрос такой. В учебнике по С++ встречал упоминание о том, что экземпляр класса можно сделать потомком одновременно двух разных классов-родителей, типа

class A
{...}
class B
{...}
class C : public A : public B
{...}

Или что-то в этом роде (найти источник не могу). А как обстоят дела с этим в MQL5? Можно ли объявить, что класс является  потомком одновременно двух разных классов-родителей? Каков синтаксис?

Фраза из Справочника: "Нет множественного наследования" - это не о такой ситуации? 

 
Yedelkin:

Тема "ООП" вылилась в обмен мнениями типа "хорошо или не очень". Хотелось бы ответов на более приземлённые вопросы.

Вопрос такой. В учебнике по С++ встречал упоминание о том, что экземпляр класса можно сделать потомком одновременно двух разных классов-родителей, типа

Или что-то в этом роде (найти источник не могу). А как обстоят дела с этим в MQL5? Можно ли объявить, что класс является  потомком одновременно двух разных классов-родителей? Каков синтаксис?

Фраза из Справочника: "Нет множественного наследования" - это не о такой ситуации? 

 

В MQL5 множественное наследование не поддерживается но есть интересный механизм передачи указателя объекта через который можно реализовать что то наподобии.

 

С ООП оказалось очень удобно структурировать код (пардон за банальность). Берешь и штампуешь методы один за другим. Очень эффективно и наглядно. Но возник вопрос, не сказывается ли такая многообёрточность на скорости обработки кода процессором? Если конкретно, то имеется ли какая-нибудь разница в скорости выполнения между вот такими двумя вариантами кода:

double ddd=0.0;                   //первый вариант кода, инициализация без применения функций/методов
 

double ddd;                       //второй вариант кода, инициализация с применением функций/методов
void function(double a) { a=0.0; }
...
function(ddd);

 Или же на стадии компиляции код преобразуется с человеческого на машинный язык так, что для компьютера оба эти варианта ничем не отличаются по скорости обработки?

 
Urain:

В MQL5 множественное наследование не поддерживается ...

Т.е. "множественное наследование" - это и есть множественность родителей? 

 
Yedelkin:
Т.е. "множественное наследование" - это и есть множественность родителей? 

Да именно у класса может быть один родитель, каскадно можно, но двух родителей и mql5 не может быть.

В принципе вместо наследования можно вызвать класс-"типа как родитель" в самом классе и обращаться к данным "типа как родителя" через его указатель.

 
Urain:
Да именно у класса может быть один родитель, каскадно можно, но двух родителей и mql5 не может быть.
ОК, понял. Сразу не догадался поиском посмотреть значение термина.
 
Yedelkin:

Вот этот код почти ничем от множественного наследования не отличается.

class C_A
  {
public:
                     C_A(void){};
                    ~C_A(void){};
   double            a;
  };
//+------------------------------------------------------------------+
class C_B
  {
public:
                     C_B(void){};
                    ~C_B(void){};
   double            b;
  };
//+------------------------------------------------------------------+
class C_C
  {
public:
   C_A              *ua;
   C_B              *ub;
                     C_C(void){ua=new C_A();ub=new C_B();};
                    ~C_C(void){delete ua;delete ub;};
  };
//+------------------------------------------------------------------+
Фактически класс С_С через соответствующие указатели имеет доступ к данным С_А и С_В.
 
Urain:

Вот этот код почти ничем от множественного наследования не отличается.

Фактически класс С_С через соответствующие указатели имеет доступ к данным С_А и С_В.

Круто! Я бы не додумался создавать в конструкторе экземпляр внешнего класса. Спасибо за помощь!

Дополнение. А вот в этой строчке

C_C(void){ua=new C_A();ub=new C_B();};

оператор new применяется к конструктору C_A() класса C_A.

Из Справочника  же  я понял, что у оператора new операндом выступает сам класс, а не его конструктор. Какие тут могут быть особенности?

 
Кстати, через некоторое время у конструкторов будут работать параметры, что сильно упростит жизнь разработчикам.
 
Renat:
Кстати, через некоторое время у конструкторов будут работать параметры, что сильно упростит жизнь разработчикам.
Да, я помню про это :)
 
Yedelkin:

Круто! Я бы не додумался создавать в конструкторе экземпляр внешнего класса. Спасибо за помощь!

Дополнение. А вот в этой строчке

оператор new применяется к конструктору C_A() класса C_A.

Из Справочника  же  я понял, что у оператора new операндом выступает сам класс, а не его конструктор. Какие тут могут быть особенности?   

 

 

Оператор new создаёт экземпляр класса и в связке с ним идёт вызов конструктора. Это прописано в синтаксисе поэтому по другому вызвать не получится.

В статичном объявлении всё происходит автоматически.

Вот так кстати тоже будет работать и автоматически уничтожаться

class C_C
  {
public:
   C_A               ua;
   C_B               ub;
                     C_C(void){};
                    ~C_C(void){};
  };
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5