Как компилятор работает с 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++ обеспечивает работу динамического полиморфизма, позволяя правильно вызывать методы производных классов через указатели или ссылки на базовый класс.

Уровень

  • Рейтинг:

    2

  • Сложность:

    8

Навыки

  • C++

Подпишись на C/C++ Developer в телеграм