Если это невозможно создать, я не могу создать базовый указатель
Здесь ваши рассуждения сходят с ума.Неспособность создать экземпляр не означает, что вы не можете создать базовый указатель.Минимальный пример:
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.