Ниже рассмотрены случаи перекрытия (override) и перегрузки (overload) на примере двух классов Account и Deposit:
class Account {
// ...
void display(const char *fmt);
void display(const int mode = 0);
};
class Deposit : public Account {
// ...
void display(const std::string &fmt);
};
В данном случае одноименный метод display в производном классе Deposit
перекрывает (override) методы базового класса Account, таким образом
методы базового и производного классов не образуют множество перегруженных
функций.
Использование в производном классе объявления using вводит именованный
член базового класса в область видимости производного, тем самым перегружая (overload)
одноименный метод display позволяя создать единое множество перегруженных функций базового и производного классов.
class Account {
// ...
void display(const char *fmt);
void display(const int mode = 0);
};
class Deposit : public Account {
// ...
void display(const std::string &fmt);
using Account::display;
};
В виде примечания в Java понятие перекрытия существует только если у одноименных методов идентичны их сигнатуры, в остальном все методы перегружаются создавая единое множество перегруженных методов базового и производного классов:
class Account {
public void display(char fmt) {
// ...
}
public void display(int mode) {
// ...
}
}
class Deposit extends Account {
public void display(String fmt) {
// ...
}
// ...
}
Также стоит упомянуть о новом синтаксисе C++11 - использование спецификатора override. Использование данного спецификатора гарантирует, что функция 1) - является виртуальной и 2) перекрывает виртуальную функцию базового класса с идентичной ей сигнатурой:
class Alpha {
public:
virtual void foo();
void bar();
};
class Beta : public Alpha {
public:
void foo() override; // допустимо
// void foo() const override; // недопустимо
// void bar() override; // недопустимо
};