Всегда ли абстрактным классам принадлежит vtable? - PullRequest
0 голосов
/ 05 февраля 2019

У меня проблемы с пониманием, почему у абстрактных классов есть vtables.Я знаю, что этот вопрос возник в следующих постах, которые я прочитал, так что потерпите меня:

VTABLE для абстрактных классов C ++

абстрактные классы имеют VTABLE?

Почему у абстрактного класса есть vtable?

Вот что я знаю: vtables используются для включения полиморфного поведениякогда я использую производный объект через указатель базового класса.Если я сейчас вызову виртуальный метод этого базового класса, он перейдет в таблицу базовых данных, посмотрит на реальный тип объекта, на который он указывает, и найдет ближайший специализированный переопределение этого метода и использует его.Класс является абстрактным, если он содержит хотя бы одну чисто виртуальную функцию, то есть он не может быть создан.Если это невозможно создать, я не могу создать базовый указатель, поэтому я не могу использовать его полиморфным способом?Так почему бы иметь возможность иметь vtable?

1 Ответ

0 голосов
/ 05 февраля 2019

Если это невозможно создать, я не могу создать базовый указатель

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

struct B {
    virtual void foo() = 0;
};

struct D : B {
    void foo() override {};
};

int main(){
   D d;
   B* ptr = &d; // base pointer to abstract class
}

Так почему он может иметь виртуальную таблицу?

Так что вызовы виртуальных функций могут быть отправлены реализациямв конкретных подклассах. Если подумать, это то, для чего вообще нужен vptr.

Таблицу абстрактной базы можно использовать для реализации dynamic_cast.Его также можно использовать в тех случаях, когда из конструктора или деструктора базы вызываются чистые виртуальные функции, поскольку в этих случаях vptr еще не будет указывать на производный vtable.

...