#c
#c
Вопрос:
Может ли кто — нибудь помочь мне, сколько VTABELS создано для этого кода. Я здесь в замешательстве.
#include lt;iostreamgt; using namespace std; class B { public: virtual void func() { cout lt;lt; "base" lt;lt; endl; } }; class D : public B { public: }; int main() { B b1, b2; D d1, d2; d1.func(); return 0; }
Я полагаю, что здесь будет создано 4 Vptrs для объектов b1, b2, d1, d2 соответственно, правильно или 6 Vptrs?
Комментарии:
1. ВТБ-это деталь реализации. Существуют и другие способы реализации полиморфизма.
2. Что не отменяет? Какого результата вы ожидаете и почему?
Ответ №1:
Реализация vtables
и vpointers
специфична для компилятора. Вообще говоря, вы получите
- По одному
vtable
на класс, у которого есть виртуальная функция. - По одному
vpointer
на объект класса, который имеетvtable
.
Итак, основываясь на этом общем подходе
B b1, b2;
будет иметь 2 vpointersD d1, d2;
будет иметь 4 указателя( 2 для класса d и 2 для класса b)
Таким образом, в конце концов у вас будет 6 vpointers.
Также обратите внимание, что для работы динамического полиморфизма(переопределения) вам понадобятся указатели, а не объекты стека, хотя это другая тема.
Комментарии:
1. Понял , спасибо !! Но в этом случае класс D не будет иметь никакой VTABLE от компилятора ? или это зависит от компилятора
2. Это зависит от компилятора. Еще раз обратите внимание, что для того, чтобы переопределение работало, вы должны использовать указатели
D* d1 = new D(); d1-gt;func();.
, если мой ответ помог вам повысить голос!