Как компилятор работает с vTable и vptr в C++?
Вопрос проверяет понимание механизмов полиморфизма в C++ через использование vTable и vptr.
Короткий ответ
vTable — это таблица указателей на функции для реализации динамического полиморфизма, а vptr — указатель на эту таблицу, который хранится в каждом объекте.
Длинный ответ
Что такое vTable и vptr:
- vTable: Таблица, которая хранит указатели на виртуальные функции класса. Каждый класс, содержащий хотя бы одну виртуальную функцию, имеет свою vTable.
- vptr: Указатель в объекте, который указывает на vTable соответствующего класса.
Как работает компилятор:
- При создании объекта компилятор автоматически настраивает vptr в конструкторе объекта.
- При вызове виртуальной функции через базовый класс компилятор использует vptr для доступа к vTable и выполнения соответствующего метода.
Пример:
class Base {
public:
virtual void show() { cout << "Base class" << endl; }
};
class Derived : public Base {
public:
void show() override { cout << "Derived class" << endl; }
};
int main() {
Base* basePtr = new Derived();
basePtr->show(); // Вызывается show() из Derived, используя vptr
delete basePtr;
return 0;
}Концепция vTable и vptr в C++ обеспечивает работу динамического полиморфизма, позволяя правильно вызывать методы производных классов через указатели или ссылки на базовый класс.