TGViewer
Грокаем C++ Грокаем C++ @grokaemcpp · 9.36K subscribers
Post #1137 4.01K
Какой метод не переопределяется?
#новичкам

Для начала. Что будет если не пометить переопределенный в дочернем классе метод как override?

Обычно говорят, что override генерирует проверку компилятора, что данный метод действительно переопределяет метод базового класса. И соотвественно ошибку в случае, если это не так.

Проверки - это дело важное и нужное, их нужно использовать. Но в том-то и дело, что override - это лишь проверка. Она никак не влияет на то, реально ли переопределяется метод или нет.

Взглядните на этот код:

struct Base {
virtual void foo(int i) const {
std::cout << "Base" << std::endl;
}
virtual ~Base() = default;
};

struct Derived : Base {
void foo(int) const {
std::cout << "Derived" << std::endl;
}
};

int main() {
std::unique_ptr<Base> p = std::make_unique<Derived>();
p->foo(42);
}


Является ли метод foo в Derived переопределением метода из Base?

Казалось бы, нет пометок ни virtual, ни override.

Но это и не важно. Главное, чтобы сигнатура метода из дочернего класса была ровно такой же, какой была сигнатура виртуального метода в базовом классе. Здесь с этим все в порядке, поэтому метод действительно переопределяется..

То есть метод не переопределяется только в случае отличной сигнатуры. Поставьте в этом случае override и тогда будет ошибка компиляции. Поставьте в наследнике virtual и сделаете новый метод виртуальный метод в наследнике. Ничего не делаете и получите просто новый невиртуальный метод в наследнике.

Что же влияет на сигнатуру?


1️⃣ Имя функции и набор параметров. Это банально и все знают.

2️⃣ CV-квалификация метода. Грубо говоря, константный метод или нет.

3️⃣ Ref-квалификация метода. Говорили о них тут.

Если что-то из этого не соответствует виртуальному методу в родительском классе, то дочерний метод не будет переопределять родителя.

Use checks. Stay cool.

#cppcore
  • ❤ 13
  • 👍 6
  • 🔥 6
More from @grokaemcpp
  1. Oct 8, 2026​​Strict weak ordering #опытным На первый взгляд, всё выглядит рабочим: мы создаём 40 зака…
  2. Oct 7, 2026​​Где-то баг... #опытным Вот вам код: struct Order { int price; int id; }; int main() { st…
  3. Oct 5, 2026Откуда spurious wakeup на кондваре? #опытным У кондваров есть метод std::condition_variabl…
  4. Oct 1, 2026​​Stacktrace. Tips #опытным Чтобы полноценно работать со стандартными трейсами, нужно знат…
  5. Sep 28, 2026​​Stacktrace #опытным Одна из проблема исключений - непонятно, откуда оно прилетело. Ну да…
  6. Sep 25, 2026​​std::spanstream #опытным Радостная весть для всех, кто пользуется iostreams! В C++23 доб…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →