Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·52 588вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 748
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 437
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 093
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • iOS1 047
  • Backend вакансии996
  • Fullstack вакансии441
  • Frontend вакансии355
  • AI вакансии354
  • Mobile вакансии27

По стеку

  • Go2 987
  • Java1 810
  • Kotlin868
  • Node.js675
  • Rust436
  • .NET434
  • PHP248
  • C++204
  • C#190

DevOps и инфраструктура

  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • DevOps вакансии1 678
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise71 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify14 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий
  • Adyen8 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме C++Все вопросы
C++JuniorТеория

В чём разница между override и virtual в C++?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

virtual объявляет функцию полиморфной в базовом классе; override в производном классе подтверждает переопределение и вызывает ошибку компиляции при несовпадении сигнатур, предотвращая скрытые баги.

override

  • Указывается в производном классе после сигнатуры функции.
  • Если сигнатура не совпадает с базовой (опечатка в имени, другие параметры, другая const-квалификация) — ошибка компиляции. Без override такая функция тихо создаёт новую невиртуальную функцию, скрывая базовую.
  • Является документацией намерения и защитой от регрессий при рефакторинге.
#include <iostream>
#include <memory>

struct Animal {
    virtual void speak() const {
        std::cout << "...\n";
    }
    virtual void move() const {
        std::cout << "moves\n";
    }
    virtual ~Animal() = default;  // виртуальный деструктор обязателен!
};

struct Dog : Animal {
    void speak() const override {      // OK — переопределяет Animal::speak
        std::cout << "Woof\n";
    }
    // void spek() const override;    // ошибка компиляции — нет такой функции в базе
    // void move() const;             // без override: скрывает, не переопределяет
};

struct Cat : Animal {
    void speak() const override {
        std::cout << "Meow\n";
    }
};

int main() {
    std::unique_ptr<Animal> animals[] = {
        std::make_unique<Dog>(),
        std::make_unique<Cat>(),
    };
    for (auto& a : animals) {
        a->speak();   // Dog: Woof, Cat: Meow — динамический полиморфизм
    }
}

virtual и override в C++

virtual объявляет функцию участницей механизма динамического полиморфизма: при вызове через указатель или ссылку на базовый класс будет вызвана версия производного класса, определённая в vtable. override — спецификатор C++11, который явно говорит компилятору «эта функция переопределяет виртуальную функцию базового класса» и добавляет проверку на этапе компиляции.

virtual

  • Помечается в базовом классе.
  • Наследуется автоматически: функция остаётся виртуальной во всех производных классах, даже без повторного слова virtual.
  • Вызов идёт через vtable (pointer indirection), поэтому чуть дороже невиртуального вызова.

final

Ещё один спецификатор C++11. Запрещает дальнейшее переопределение функции или наследование от класса:

struct Base {
    virtual void foo() {}
};

struct Mid : Base {
    void foo() override final {}  // нельзя переопределить в Derived
};

struct Derived : Mid {
    // void foo() override {}  // ошибка компиляции
};

struct Sealed final : Base {   // нельзя наследоваться от Sealed
    void foo() override {}
};

Виртуальный деструктор

Если класс предназначен для наследования и объект будет удаляться через указатель на базовый класс, деструктор базового класса должен быть virtual. Иначе деструктор производного класса не вызывается — утечка ресурсов и UB.

Подводные камни

  • Функция без override, сигнатура которой отличается от базовой (например, const пропущен), создаёт новую функцию вместо переопределения — компилятор не предупредит без override.
  • Виртуальный вызов в конструкторе или деструкторе не полиморфный: вызывается версия того класса, чей конструктор/деструктор выполняется в данный момент.
  • Невиртуальный деструктор в полиморфном базовом классе приводит к неполному разрушению объекта.
  • Vtable добавляет один указатель (8 байт) к каждому объекту класса с виртуальными функциями — важно при миллионах мелких объектов.
  • Виртуальные функции плохо инлайнятся: компилятор не всегда может девиртуализировать вызов, что снижает производительность в горячих циклах.
  • Слово virtual в производном классе без override избыточно, но не ошибка — путает читателя кода.

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?

Типичные ошибки

  • Объяснять override и virtual только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для override и virtual, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://en.cppreference.com/w/cpp/language/override

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs

Вакансии с этим навыком

C++ вакансии
  • Senior C++ Software Engineer (#5819)
  • Security Architect
  • Sr. Software Developer - C#/WPF for UI/UX Development
  • Data Scientist (NLP Deep Learning Engineer)
  • Manager, Engineering (Remote Eligible in Bulgaria)