Eu descobri, mas vou deixar a solução aqui, caso alguém mais se depare com o mesmo problema.
Eu esqueci e a palavra-chave const após a substituição do método que mudou sua assinatura.
Eu descobri, mas vou deixar a solução aqui, caso alguém mais se depare com o mesmo problema.
Eu esqueci e a palavra-chave const após a substituição do método que mudou sua assinatura.
para isto você tem que usar a palavra-chave 'override' sempre quando você sobrepõe métodos, desta forma o compilador grita se a assinatura do método for alterada:
ele não compilará por causa da diferença 'const'.
E você também esqueceu a palavra-chave "virtual" em ambos os casos:
E você também esqueceu a palavra-chave "virtual" em ambos os casos:
Sim, mas pelo menos no CObject você precisa da palavra-chave virtual
nicholishen: Não... Eu não quero que a criança seja substituída por nenhuma derivação possível. |
|
|
Não adicionar virtual na base fará você perder o polimorfismo - o método será chamado estaticamente e não dinamicamente em tempo de execução.
{
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();
}
Você está errado aqui, whroeder1.
Não adicionar virtual na base fará você perder o polimorfismo - o método será chamado estaticamente e não dinamicamente em tempo de execução.
{
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();
}
Correto. Omitir também o virtual significa que a classe derivada pode se sobrepor, mas não será chamada de um ponteiro pai.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Não consigo encontrar nenhuma documentação sobre como implementar a ordenação de Listas em mql5. Vejo que a CLIST chama a Comparação() a partir do ponteiro CObjeto. Então, como posso chamar a classe criança de Compare() a partir do ponteiro dos pais?
Exemplo:
//+------------------------------------------------------------------+
//| 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());
}
}