OLP. Problemas de aplicación

 

El temade la OLP se ha convertido en un intercambio de opiniones "buenas o no tan buenas". Me gustaría recibir respuestas a preguntas más concretas.

La cuestión es la siguiente. En un libro de texto sobre C++ he encontrado una mención a que una instancia de una clase puede hacerse descendiente de dos clases padre diferentes simultáneamente, como

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

O algo parecido (no encuentro la fuente). ¿Cuál es la situación en MQL5? ¿Es posible declarar que la clase es descendiente de dos clases padre diferentes? ¿Cuál es la sintaxis?

¿La frase de Help: "No hay herencia múltiple" no se refiere a esta situación?

 
Yedelkin:

El temade la "OLP" se ha convertido en un intercambio de opiniones "buenas o malas". Me gustaría que se respondiera a preguntas más concretas.

La cuestión es la siguiente. En un libro de texto sobre C++ he encontrado una mención a que una instancia de una clase puede hacerse descendiente de dos clases padre diferentes simultáneamente, como

O algo parecido (no encuentro la fuente). ¿Cuál es la situación en MQL5? ¿Es posible declarar que la clase es descendiente de dos clases padre diferentes? ¿Cuál es la sintaxis?

¿La frase de Help: "No hay herencia múltiple" no se refiere a esta situación?

En MQL5 no se admite la herencia múltiple, pero hay un mecanismo interesante para el paso del puntero del objeto, a través del cual se puede implementar algo como esto.

 

Con la POO, es muy fácil estructurar el código (perdón por la trivialidad). Toma y estampa los métodos uno a uno. Es muy efectivo y claro. Pero surge una pregunta: ¿esta multiplicidad de envoltorios no afecta a la velocidad de procesamiento del código por parte del procesador? En concreto, ¿hay alguna diferencia en la velocidad de ejecución entre estos dos fragmentos de código?

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

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

¿O en la fase de compilación se convierte el código de lenguaje humano a lenguaje de máquina de manera que ambas variantes no difieran en absoluto en la velocidad de procesamiento para un ordenador?

 
Urain:

La herencia múltiple no está soportada en MQL5 ...

Entonces, ¿la "herencia múltiple" es la pluralidad de padres?

 
Yedelkin:
Entonces, ¿la "herencia múltiple" es la crianza en plural?

Sí exactamente una clase puede tener un padre, en cascada puede, pero dos padres y mql5 no.

En principio, en lugar de la herencia, se podría llamar a la clase "tipo como padre" en la propia clase y acceder a los datos del "tipo como padre" a través de su puntero.

 
Urain:
Sí exactamente una clase puede tener un padre, en cascada puede, pero dos padres y mql5 no.
Bien, lo tengo. No se me ocurrió buscar el significado del término de inmediato.
 
Yedelkin:

Este código casi no difiere de la herencia múltiple.

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;};
  };
//+------------------------------------------------------------------+
De hecho, la clase C_C tiene acceso a los datos de C_A y C_B a través de los punteros correspondientes.
 
Urain:

Este código casi no difiere de la herencia múltiple.

De hecho, la clase C_C tiene acceso a los datos de C_A y C_B a través de los correspondientes punteros.

¡Genial! No se me habría ocurrido crear una instancia de una clase externa en el constructor. Gracias por la ayuda.

Adenda. Y en esta línea

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

El operador new se aplica al constructor C_A() de la clase C_A.

Del libro de referencia, entendí que el operando del operador new es la propia clase, no su constructor. ¿Qué peculiaridades puede haber aquí?

 
Por cierto, después de un tiempo, los diseñadores tendrán parámetros de trabajo, lo que facilitará mucho la vida a los desarrolladores.
 
Renat:
Por cierto, al cabo de un tiempo los diseñadores tendrán los parámetros funcionando, lo que facilitará mucho la vida a los desarrolladores.
Sí, lo recuerdo :)
 
Yedelkin:

¡Genial! No se me habría ocurrido crear una instancia de una clase externa en el constructor. Gracias por la ayuda.

Adenda. Y en esta línea.

El operador new se aplica al constructor C_A() de la clase C_A.

Del libro de referencia, entendí que el operando del operador new es la propia clase, no su constructor. ¿Qué peculiaridades puede haber aquí?

El operador new crea una instancia de la clase y junto a ella se llama a un constructor. Está escrito en la sintaxis, por lo que no se puede llamar de otra manera.

Todo sucede automáticamente en la declaración estática.

Por cierto, esto también funcionará y se destruirá automáticamente

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
Razón de la queja: