Fehler, Irrtümer, Fragen - Seite 1678

 
Комбинатор:
Sie können dies verwenden, um ein Analogon zum Schlüsselwort final zu schaffen, das eine weitere Vererbung ausdrücklich verbietet.
Aber wie das obige Beispiel zeigt, kann man keine Analogie herstellen. Auch für private-Methoden müssen Sie final angeben.
 
fxsaber:
Aber wie das obige Beispiel zeigt, kann man keine Analogie herstellen. Sie müssen auch bei privaten Methoden final angeben.

Für die öffentliche Vererbung sollte der maximale Zugang geschützt werden, nicht der private.

Und die Funktion im Beispiel wird genau überladen?

 
Комбинатор:

Für die öffentliche Vererbung sollte der maximale Zugang geschützt werden, nicht der private.

Und in dem Beispiel ist die Funktion genau überladen?

Richtig. Ich habe es gerade selbst herausgefunden.

Wenn Sie das tun

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

können Sie selbst überprüfen, ob Sie wissen, was passieren soll.

 

Im Terminalprotokoll erhalte ich

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

unbeholfen an die angegebene Stelle im Quellcode gehen. Es wäre praktisch, wenn Sie auf eine solche Meldung im Terminalprotokoll doppelklicken könnten, um direkt zu der angegebenen Zeile zu gelangen.

Wenn jemand dafür ist, soll er es sagen.

 
Sergei Vladimirov:

Der Klassiker ist eine Schnittstelle in einer Basisklasse mit Neudefinition in Nachfolgeklassen:

Klassisch ist es, wenn geschützte/öffentliche-virtuelle Methoden überschrieben werden. Aber für Privatpersonen ist es nicht so offensichtlich (in Bezug auf die Anwendung). Vielen Dank für die Antwort.
 
fxsaber:
Klassisch ist es, wenn geschützte/öffentliche virtuelle Methoden außer Kraft gesetzt werden. Aber für Privatpersonen ist es nicht so offensichtlich (in Bezug auf die Anwendung). Vielen Dank für Ihre Antwort.

Ja, ich habe mein Beispiel bereits gelöscht, ohne Ihre Antwort zu sehen, das war wirklich unglücklich.

Upd. Ich war selbst in den Grundlagen verwirrt, als ich Ihnen antwortete. In diesem Beispiel war alles korrekt, ich hätte es nicht löschen sollen. Das gleiche Beispiel noch einmal mit einem Anwendungsbeispiel:

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:

Upd. Ich war selbst von den Grundlagen verwirrt, als ich Ihnen geantwortet habe. In diesem Beispiel war alles richtig, ich hätte es nicht löschen sollen. Wieder mit einem Beispiel für die Verwendung:

Kein gutes Beispiel, da die Schnittstelle CAnimal nirgends verwendet wird. Ja, sie haben auch zwei Nachkommen veröffentlicht. Ich verstehe das Thema, also ist es in Ordnung.
 
#property indicator_buffers 1 + 1

Der Compiler macht keine halben Sachen.

 
fxsaber:
Dies ist kein gutes Beispiel, da die Schnittstelle CAnimal nirgends verwendet wird. Auch zwei Nachkommen sind bekannt geworden. Ich verstehe das Thema, also ist es in Ordnung.

Normales Beispiel. Ein abstraktes Tier macht grundsätzlich Geräusche, die aber nicht definiert sind, so dass wir die Methode Speak() nicht für dieses Tier aufrufen können; sie kann nur für ein Tier einer bestimmten Art aufgerufen werden. Deshalb deklarieren wir eine geschlossene virtuelle Methode in einer Basisklasse und überschreiben sie in den Nachfolgeklassen und öffnen sie.

 
Sergei Vladimirov:

Normales Beispiel. Ein abstraktes Tier macht grundsätzlich Geräusche, die aber nicht definiert sind, so dass wir die Methode Speak() nicht für dieses Tier aufrufen können; sie kann nur für ein Tier einer bestimmten Art aufgerufen werden. Deshalb deklarieren wir eine geschlossene virtuelle Methode in einer Basisklasse und überschreiben sie in den Nachfolgeklassen und öffnen sie.

Es wäre sinnvoll, sie auch in nachgeordneten Klassen privat zu machen. Zum besseren Verständnis. Das ist nicht der Punkt, kurz gesagt.
Grund der Beschwerde: