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.
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:
voidvirtual Speak(){}
};
class CDog : public CAnimal
{
public:
void Speak(){Print("Гав!");}
};
class CBigDog : public CDog
{
public:
void Speak(){Print("Громкий гав!");}
};
voidOnStart()
{
CDog oDog;
oDog.Speak();
CBigDog oBigDog;
oBigDog.Speak();
CDog* pDog = &oBigDog;
pDog.Speak(); // "Громкий гав!", а не "Гав!", как было бы без виртуального метода
}
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.
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.
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.
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'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
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.
Il classico è un'interfaccia in una classe base con ridefinizione nei discendenti:
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:
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:
Il compilatore non fa una piega.
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.
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.