VTABLE для производного вызова не переопределяет

#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 специфична для компилятора. Вообще говоря, вы получите

  1. По одному vtable на класс, у которого есть виртуальная функция.
  2. По одному vpointer на объект класса, который имеет vtable .

Итак, основываясь на этом общем подходе

  • B b1, b2; будет иметь 2 vpointers
  • D d1, d2; будет иметь 4 указателя( 2 для класса d и 2 для класса b)

Таким образом, в конце концов у вас будет 6 vpointers.

Также обратите внимание, что для работы динамического полиморфизма(переопределения) вам понадобятся указатели, а не объекты стека, хотя это другая тема.

Комментарии:

1. Понял , спасибо !! Но в этом случае класс D не будет иметь никакой VTABLE от компилятора ? или это зависит от компилятора

2. Это зависит от компилятора. Еще раз обратите внимание, что для того, чтобы переопределение работало, вы должны использовать указатели D* d1 = new D(); d1-gt;func();. , если мой ответ помог вам повысить голос!