OLP. Questões de aplicação

 

O temado OOP transformou-se numa troca de opiniões "boas ou menos boas". Gostaria de obter respostas a mais perguntas sobre a terra.

A questão é esta. Num livro sobre C++ encontrei uma menção de que uma instância de uma classe pode ser feita descendente de duas classes-mãe diferentes simultaneamente, como

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

Ou algo semelhante (não consegue encontrar a fonte). Qual é a situação na MQL5? É possível declarar que a classe é descendente de duas classes-mãe diferentes? Qual é a sintaxe?

Não é a frase da Help: "No multiple inheritance" sobre esta situação?

 
Yedelkin:

O temada OLP transformou-se numa "boa ou não tão boa" troca de opiniões. Gostaria de obter respostas a mais perguntas sobre a terra.

A questão é esta. Num livro sobre C++ encontrei uma menção de que uma instância de uma classe pode ser feita descendente de duas classes-mãe diferentes simultaneamente, como

Ou algo semelhante (não consegue encontrar a fonte). Qual é a situação na MQL5? É possível declarar que a classe é descendente de duas classes-mãe diferentes? Qual é a sintaxe?

Não é a frase da Help: "No multiple inheritance" sobre esta situação?

Na MQL5 a herança múltipla não é suportada, mas existe um mecanismo interessante para a passagem do ponteiro do objecto, através do qual algo como isto pode ser implementado.

 

Com o OOP, é muito fácil estruturar o código (perdoar a trivialidade). Os métodos de filmar e carimbar um a um. É muito eficaz e claro. Mas levanta-se uma questão: será que estas embalagens múltiplas não afectam a velocidade de processamento do código pelo processador? Especificamente, existe alguma diferença na velocidade de execução entre estes dois fragmentos de código?

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

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

Ou na fase de compilação é o código convertido da linguagem humana para a linguagem da máquina, para que estas duas variantes não difiram em nada na velocidade de processamento de um computador?

 
Urain:

A herança múltipla não é suportada na MQL5 ...

Então "herança múltipla" é a pluralidade de pais?

 
Yedelkin:
Então a "herança múltipla" é a parentalidade plural?

Sim, exactamente uma classe pode ter um dos pais, uma lata em cascata, mas dois pais e mql5 não podem.

Em princípio, em vez de herança, poderia chamar a classe "tipo como pai" na própria classe e aceder aos dados "tipo como pai" através do seu ponteiro.

 
Urain:
Sim, exactamente uma classe pode ter um dos pais, uma lata em cascata, mas dois pais e mql5 não podem.
OK, já está. Não pensei em procurar o significado do termo logo de imediato.
 
Yedelkin:

Este código quase não é diferente de herança múltipla.

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;};
  };
//+------------------------------------------------------------------+
Na verdade, a classe C_C tem acesso aos dados C_A e C_B através de indicadores apropriados.
 
Urain:

Este código quase não é diferente de herança múltipla.

Na verdade, a classe C_C tem acesso aos dados de C_A e C_B através de indicadores correspondentes.

Fixe! Eu não teria pensado em criar uma instância de uma classe externa no construtor. Obrigado pela ajuda!

Adenda. E, nesta linha

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

O novo operador é aplicado ao construtor de C_A() da classe C_A.

A partir do livro de referência, entendi que o operando do novo operador é a própria classe, não o seu construtor. Que peculiaridades podem existir aqui?

 
A propósito, após algum tempo, os designers terão parâmetros a funcionar, o que tornará a vida muito mais fácil para os criadores.
 
Renat:
A propósito, após algum tempo os designers terão parâmetros a funcionar, o que tornará a vida muito mais fácil para os criadores.
Sim, lembro-me disso :)
 
Yedelkin:

Fixe! Eu não teria pensado em criar uma instância de uma classe externa no construtor. Obrigado pela ajuda!

Adenda. E nesta linha.

O novo operador é aplicado ao construtor de C_A() da classe C_A.

A partir do livro de referência, entendi que o operando do novo operador é a própria classe, não o seu construtor. Que peculiaridades podem existir aqui?

O novo operador cria uma instância da classe e um construtor é chamado juntamente com ela. Está escrito na sintaxe, pelo que não se pode chamar-lhe o contrário.

Tudo acontece automaticamente na declaração estática.

A propósito, isto também funcionará e será automaticamente destruído

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