L'ho capito, ma lascio qui la soluzione nel caso in cui qualcun altro si imbatta nello stesso problema.
Ho dimenticato di e la parola chiave const dopo l'override del metodo che ha cambiato la sua firma.
L'ho capito, ma lascio qui la soluzione nel caso in cui qualcun altro si imbatta nello stesso problema.
Ho dimenticato di e la parola chiave const dopo l'override del metodo che ha cambiato la sua firma.
Per questo dovete usare la parola chiave 'override' sempre quando sovrascrivete i metodi, in questo modo il compilatore grida se la firma del metodo è cambiata:
non compilerà a causa della differenza 'const'.
E hai anche dimenticato la parola chiave 'virtuale' in entrambi i casi:
E hai anche dimenticato la parola chiave 'virtuale' in entrambi i casi:
Sì, ma almeno in CObject hai bisogno della parola chiave virtuale
nicholishen: No... non voglio che il figlio sia sovrascritto da ogni possibile derivato. |
|
|
Non aggiungere virtual nella base vi farà perdere il polimorfismo - il metodo sarà chiamato staticamente e non dinamicamente a tempo di esecuzione.
{
public:
void Sub()
{
Print("a.sub");
}
};
class b : public a
{
public:
void Sub()
{
Print("b.sub");
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
clsa *a;
clsa=new b;
clsa.Sub();
}
Qui ti sbagli, whroeder1.
Non aggiungere il virtuale nella base ti farà perdere il polimorfismo - il metodo sarà chiamato staticamente e non dinamicamente a tempo di esecuzione.
{
public:
void Sub()
{
Print("a.sub");
}
};
class b : public a
{
public:
void Sub()
{
Print("b.sub");
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
a *clsa;
clsa=new b;
clsa.Sub();
}
Corretto. Anche omettere virtuale significa che la classe derivata può sovrascrivere, ma non sarà chiamata da un puntatore genitore.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Non riesco a trovare alcuna documentazione su come implementare l'ordinamento delle liste in mql5. Vedo che CList chiama il Compare() dal puntatore CObject. Quindi come posso chiamare il metodo overridden della classe figlio Compare() dal puntatore genitore?
Esempio:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
class PriceScore : public CObject
{
protected:
int price;
int score;
public:
PriceScore(void){}
PriceScore(int p, int s):price(p),score(s){}
~PriceScore(void){}
int Compare(const CObject *node,const int mode=0);
void Price(const int p){price = p;}
int Price() const {return price;}
void Score(const int s){score = s;}
int Score() const {return score;}
};
int PriceScore::Compare(const CObject *node,const int mode=0) //Can't call this override from CList
{
PriceScore *pc = (PriceScore*)node;
Print(__FUNCTION__,":Compare called. Incoming: ",pc.Score()," This: ", score); //Doesn't log because this isn't called from CObject'
if(pc.Score()< score)return 1;
else if(pc.Score()> score) return -1;
else return 0;
}
void OnStart()
{
//---
CList list;
list.Add( new PriceScore(100,500));
list.Add( new PriceScore(1,5));
list.Add( new PriceScore(13,5000));
list.Add( new PriceScore(987987,567));
list.Add( new PriceScore(98798778,1));
PriceScore *node = NULL;
Print("-------------------",TimeCurrent(),"--------------------");
for(int i=0;i<list.Total();i++)
{
node = list.GetNodeAtIndex(i);
Print("Price = ",node.Price(),", Score = ",node.Score());
}
list.Sort(1); //Can't call overriden child method'
Print("-------------------SORTED--------------------");
for(int i=0;i<list.Total();i++)
{
node = list.GetNodeAtIndex(i);
Print("Price = ",node.Price(),", Score = ",node.Score());
}
}