В контексте разговоров о C++ довольно часто можно встретить слова перегрузка и переопределение. Что же они означают и когда используются?

Перегрузка (англ. overloading) означает, что у вас в одной области видимости определено несколько функций с одинаковым именем. Например:

class A {
  void print();
  void print(int i);
  void print(const A& a);
};

Нужная функция выбирается в момент компиляции исходя из типа переданного аргумента.

Переопределение (англ. overriding) означает, что вы создали иерархию классов, у которой в базовом классе есть виртуальная функция и вы можете переопределить (override) её в производном классе.

class Base {
public:
  // реализует некоторый алгоритм
  void doSomething() {
    prepare(); // сперва выполнить подготовку

    // основная часть алгоритма не приведена для краткости
  }
private:
  virtual void prepare() {}
};

class Derived : public Base {
private:
  virtual void prepare() {
    // выполнить подготовку
    std::cout << "hello world :)\n";
  }
};

Derived obj;
obj.doSomething(); 

Поясню, что в последнем примере, при вызове функции doSomething будет работать функция prepare из производного класса Derived.

Реклама