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)
| |
}
| |
//+------------------------------------------------------------------+
|