Erros, bugs, perguntas - página 1678

 
Комбинатор:
Pode utilizar isto para fazer um análogo da palavra-chave final, proibindo explicitamente a continuação da herança.
Mas como o exemplo acima mostra, não se pode fazer um análogo. Deve especificar final mesmo para os métodos privados.
 
fxsaber:
Mas como o exemplo acima mostra, não se pode fazer um análogo. Deve-se especificar o final mesmo para métodos privados.

Estranho. Para o património público, o acesso máximo deve ser protegido e não privado.

E a função no exemplo está exactamente a ser sobrecarregada?

 
Комбинатор:

Estranho. Para o património público, o acesso máximo deve ser protegido, e não privado.

E no exemplo, a função está exactamente sobrecarregada?

Certo. Eu próprio acabei de o descobrir.

Se o fizer

BASE() {Func();} // вместо void Init() {Func();} Вызов  Base.Init() - убрать конечно.

pode verificar-se a si próprio depois de a executar e ver se sabe o que é suposto acontecer.

 

No diário de bordo terminal recebo

2016.09.12 15:49:14.209 Simple_Test (RTS-9.16,M1)       array out of range in 'Simple_Test.mqh' (85,33)

ir desajeitadamente para o local especificado no código fonte. Seria conveniente se pudesse fazer duplo clique sobre tal mensagem no diário de bordo do terminal e ir directamente para a linha especificada.

Se alguém o apoiar, fale alto.

 
Sergei Vladimirov:

O clássico é uma interface numa classe base com redefinição em descendentes:

Clássico é quando os métodos protegidos/públicos-virtuais são anulados. Mas para o privado, não é tão óbvio (em termos de aplicação). Obrigado pela resposta.
 
fxsaber:
Clássico é quando os métodos virtuais protegidos/públicos são anulados. Mas para o privado, não é tão óbvio (em termos de aplicação). Obrigado pela resposta.

Sim, já apaguei o meu exemplo sem ver a sua resposta, foi realmente lamentável.

Eu próprio fiquei confuso com o básico enquanto vos respondia. Tudo estava correcto nesse exemplo, eu não o deveria ter apagado. O mesmo exemplo mais uma vez com um exemplo de utilização:

class CAnimal
{
private:
   void virtual Speak(){}
};

class CDog : public CAnimal
{
public:
   void Speak(){Print("Гав!");}
};

class CBigDog : public CDog
{
public:
   void Speak(){Print("Громкий гав!");}
};

void OnStart()
{
   CDog oDog;
   oDog.Speak();
   
   CBigDog oBigDog;
   oBigDog.Speak();
   
   CDog* pDog = &oBigDog; 
   pDog.Speak();       // "Громкий гав!", а не "Гав!", как было бы без виртуального метода
}
 
Sergei Vladimirov:

Eu próprio fiquei confuso com o básico enquanto vos respondia. Tudo estava correcto nesse exemplo, eu não o deveria ter apagado. Mais uma vez com um exemplo de como o utilizar:

Não é um bom exemplo, uma vez que não se pode ver a interface CAnimal a ser utilizada em qualquer lugar. Sim, eles também tornaram públicos dois descendentes. Compreendo o tema, por isso não há problema.
 
#property indicator_buffers 1 + 1

O compilador não faz um duque.

 
fxsaber:
Este não é um bom exemplo, uma vez que não podemos ver a interface CAnimal a ser utilizada em qualquer lugar. Também dois descendentes foram tornados públicos. Compreendo o tema, por isso não há problema.

Exemplo normal. Um animal abstracto faz basicamente algum som, mas indefinido, por isso não podemos chamar-lhe o método Speak(); só pode ser chamado sobre um animal de uma espécie específica. Por conseguinte, declaramos um método virtual fechado numa classe de base, e anulamo-lo em descendentes e abrimo-lo.

 
Sergei Vladimirov:

Exemplo normal. Um animal abstracto faz basicamente algum som, mas indefinido, por isso não podemos chamar-lhe o método Speak(); só pode ser chamado sobre um animal de uma espécie específica. Por conseguinte, declaramos um método virtual fechado numa classe de base, e anulamo-lo em descendentes e abrimo-lo.

Seria útil torná-lo privado também nas classes descendentes. Para uma melhor compreensão. Não é o ponto, em suma.
Razão: