C++. Override and overload

Ниже рассмотрены случаи перекрытия (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;            // недопустимо
};