Errori, bug, domande - pagina 1678

 
Комбинатор:
Potete usarlo per fare un analogo della parola chiave final, proibendo esplicitamente un'ulteriore ereditarietà.
Ma come mostra l'esempio precedente, non si può fare un analogico. Dovete specificare finale anche per i metodi privati.
 
fxsaber:
Ma come mostra l'esempio precedente, non si può fare un'analogia. Dovete specificare final anche per i metodi privati.

Per l'eredità pubblica, l'accesso massimo dovrebbe essere protetto, non privato.

E la funzione nell'esempio viene sovraccaricata esattamente?

 
Комбинатор:

Per l'eredità pubblica, l'accesso massimo dovrebbe essere protetto, non privato.

E nell'esempio, la funzione è esattamente sovraccaricata?

Giusto. L'ho appena scoperto io stesso.

Se lo fai

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

Potete controllare voi stessi dopo averlo eseguito e vedere se sapete cosa dovrebbe succedere.

 

Nel log del terminale ottengo

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

vanno maldestramente alla posizione specificata nel codice sorgente. Sarebbe comodo se si potesse fare doppio clic su un tale messaggio nel log del terminale e arrivare direttamente alla linea specificata.

Se qualcuno lo sostiene, parli.

 
Sergei Vladimirov:

Il classico è un'interfaccia in una classe base con ridefinizione nei discendenti:

Classico è quando i metodi protetti/pubblici-virtuali sono sovrascritti. Ma per i privati non è così ovvio (in termini di applicazione). Grazie per la risposta.
 
fxsaber:
Classico è quando i metodi virtuali protetti/pubblici sono sovrascritti. Ma per i privati non è così ovvio (in termini di applicazione). Grazie per aver risposto.

Sì, ho già cancellato il mio esempio senza vedere la tua risposta, è stato davvero un peccato.

Aggiornamento: anch'io mi sono confuso nelle basi mentre ti rispondevo. Tutto era corretto in quell'esempio, non avrei dovuto cancellarlo. Lo stesso esempio di nuovo con un esempio d'uso:

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:

Aggiornamento: anch'io ero confuso dalle basi mentre ti rispondevo. Tutto era corretto in quell'esempio, non avrei dovuto cancellarlo. Di nuovo con un esempio di come usarlo:

Non è un buon esempio, dato che non possiamo vedere l'interfaccia CAnimal usata da nessuna parte. Sì, hanno anche reso pubblici due discendenti. Capisco l'argomento, quindi va bene.
 
#property indicator_buffers 1 + 1

Il compilatore non fa una piega.

 
fxsaber:
Questo non è un buon esempio, poiché non possiamo vedere l'interfaccia CAnimal utilizzata da nessuna parte. Anche due discendenti sono stati resi pubblici. Capisco l'argomento, quindi va bene.

Esempio normale. Un animale astratto emette fondamentalmente dei suoni, ma indefiniti, quindi non possiamo chiamare il metodo Speak() su di esso; può essere chiamato solo su un animale di una specie specifica. Perciò dichiariamo un metodo virtuale chiuso in una classe base, e lo sovrascriviamo nei discendenti e lo apriamo.

 
Sergei Vladimirov:

Esempio normale. Un animale astratto emette fondamentalmente dei suoni, ma indefiniti, quindi non possiamo chiamare il metodo Speak() su di esso; può essere chiamato solo su un animale di una specie specifica. Quindi dichiariamo un metodo virtuale chiuso in una classe base, e lo sovrascriviamo nei discendenti e lo apriamo.

Sarebbe utile renderlo privato anche nelle classi discendenti. Per una migliore comprensione. Non è il punto, insomma.
Motivazione: