TGViewer
C/C++ | Вопросы собесов C/C++ | Вопросы собесов @easy_c_plus · 4.19K subscribers
Post #2387 477
🤔 Какие есть тонкости при вызове виртуальной функции из конструктора или деструктора?

Вызов виртуальных функций из конструктора или деструктора в C++ может привести к неожиданным результатам, поскольку полиморфизм в этих контекстах работает иначе. Рассмотрим эти тонкости подробнее.

🚩Поведение виртуальных функций в конструкторах и деструкторах

🟠Конструкторы
Виртуальные функции в конструкторах вызываются в контексте текущего класса, а не в контексте производного класса. Когда конструктор базового класса вызывает виртуальную функцию, будет вызвана версия этой функции из самого базового класса, даже если объект принадлежит производному классу. Это связано с тем, что в момент вызова конструктора объект еще не полностью сконструирован как объект производного класса.

🟠Деструкторы
Виртуальные функции в деструкторах также вызываются в контексте текущего класса. Когда деструктор базового класса вызывает виртуальную функцию, будет вызвана версия этой функции из самого базового класса, поскольку деструкторы вызываются в порядке от производного к базовому, и в момент вызова деструктора базового класса объект уже не является объектом производного класса.

🚩Пример для иллюстрации

#include <iostream>

class Base {
public:
Base() {
std::cout << "Base constructor\n";
// Вызов виртуальной функции из конструктора
this->virtualFunction();
}

virtual ~Base() {
std::cout << "Base destructor\n";
// Вызов виртуальной функции из деструктора
this->virtualFunction();
}

virtual void virtualFunction() {
std::cout << "Base virtualFunction\n";
}
};

class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor\n";
}

~Derived() override {
std::cout << "Derived destructor\n";
}

void virtualFunction() override {
std::cout << "Derived virtualFunction\n";
}
};

int main() {
Derived d;
return 0;
}


🤔 Вывод программы:
Base constructor
Base virtualFunction
Derived constructor
Derived destructor
Base destructor
Base virtualFunction


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
More from @easy_c_plus
  1. Oct 11, 2026🤔 Расскажи о истории умных указателей История умных указателей (smart pointers) в C++ свя…
  2. Oct 10, 2026🤔 Зачем нужен виртуальный деструктор? Виртуальный деструктор необходим, когда класс предп…
  3. Oct 10, 2026🤔 Что знаешь про гарантии безопасности исключений? Гарантии безопасности исключений (Exce…
  4. Oct 9, 2026🤔 Строгая гарантия безопасности Гарантии безопасности исключений в C++ делятся на три уро…
  5. Oct 8, 2026🤔 Выбрасывание исключения из конструктора — это нормально? Да, выбрасывание исключения из…
  6. Oct 8, 2026🤔 Какое преимущество у list перед vector? List обеспечивает быстрые вставки и удаления за…
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 →