forked from rosh/MQL5Book
117 lines
3.8 KiB
MQL5
117 lines
3.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| OverrideVsOverload.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Base |
| |||
//+------------------------------------------------------------------+
| |||
class Base
| |||
{
| |||
public:
| |||
void nonvirtual(float v)
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
virtual void process(float v)
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Derived |
| |||
//+------------------------------------------------------------------+
| |||
class Derived : public Base
| |||
{
| |||
public:
| |||
void nonvirtual(int v)
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
/*
| |||
// this Derived::nonvirtual(float v) redeclaration
| |||
// will remove "deprecated behavior, hidden method calling" warning
| |||
void nonvirtual(float v)
| |||
{
| |||
Base::nonvirtual(v);
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
*/
| |||
virtual void process(int v) // override
| |||
// error: 'Derived::process' method is declared with 'override' specifier,
| |||
// but does not override any base class method
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Concrete, 2nd level derived |
| |||
//+------------------------------------------------------------------+
| |||
class Concrete : public Derived
| |||
{
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Special, 3rd level derived |
| |||
//+------------------------------------------------------------------+
| |||
class Special : public Concrete
| |||
{
| |||
public:
| |||
virtual void process(int v) override
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
virtual void process(float v) override
| |||
{
| |||
Print(__FUNCSIG__, " ", v);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
Print("");
| |||
| |||
float f = 2.0;
| |||
int i = 1;
| |||
| |||
Concrete c;
| |||
Base *ptr = &c;
| |||
| |||
// Static binding tests
| |||
| |||
ptr.nonvirtual(i); // Base::nonvirtual(float), int -> float conversion
| |||
c.nonvirtual(i); // Derived::nonvirtual(int)
| |||
| |||
// warning: deprecated behavior, hidden method calling
| |||
c.nonvirtual(f); // Base::nonvirtual(float), because
| |||
// static lookup in Base,
| |||
// Derived::nonvirtual(int) does not fit
| |||
| |||
// Dynamic binding tests
| |||
| |||
// note: no Base::process(int) and
| |||
// no overrides for process(float) in classes up to Concrete (including)
| |||
ptr.process(i); // Base::process(float), int -> float conversion
| |||
c.process(i); // Derived::process(int), because
| |||
// Concrete doesn't have an override,
| |||
// override in Special doesn't count
| |||
| |||
Special s;
| |||
ptr = &s;
| |||
// note: no Base::process(int) in ptr
| |||
ptr.process(i); // Special::process(float), int -> float conversion
| |||
ptr.process(f); // Special::process(float)
| |||
| |||
Derived *d = &s;
| |||
d.process(i); // Special::process(int)
| |||
| |||
// warning: deprecated behavior, hidden method calling
| |||
d.process(f); // Special::process(float)
| |||
}
| |||
//+------------------------------------------------------------------+
|