В C ++ нет перегрузки между областями действия. Производные области классов не являются исключением из этого общего правила.
Нет разрешения перегрузки между производным и базовым классом. Пример:
class B
{
public:
int func1(int i)
{
cout<<"B::func1()";
return i+1;
}
};
class D : public B
{
public:
double func1(double d)
{
cout<<"D::func1()";
return d+1.3;
}
};
int main ()
{
D *pd = new D;
cout << pd->func1(2) <<endl;
cout << pd->func1(2.3)<<endl;
return 0;
}
Вывод:
D::func1()3.3
D::func1()3.6
Это же правило применяется и к функциям-членам оператора, ведь они тоже являются функциями-членами!
Итак, в вашем примере кода, если Point
имел более одного operator+()
, и вы переопределили один и тот же оператор в производном классе, тогда только этот оператор производного класса будет доступен для объектов производного класса, потому что эта версия функции hides
другие версии базового класса operator+()
.
Если вы не переопределите operator+()
в производном классе, то ни одна из версий родительского класса operator+()
не будет скрыта и, следовательно, доступна через объекты класса Derived.
Отсюда и утверждение:
If a derived class wants to make all the overloaded versions available through its type, then it must either redefine all of them or none of them.
Также, пожалуйста, обратите внимание, что overloading
, overriding
и function hiding
- это три термина, которые свободно неправильно используются иногда взаимозаменяемо, но все они имеют разные значения.