Сколько vtable и vpointers будет создано в этом примере?

Вот программа на vtables. Я правильно понимаю, vtables и v-указатели.

Class B
{
public:

virtual Void Hello()
{
cout<<"Hello Base";
}
};

class D: public B
{
public:

virtual void Hello()
{
cout<<"Hello Derived";
}
};

int main(int argc, char* argv[])
{
D *d1 = new D();
D *d2 = new D();
D *d3 = new D();

return 0;
}

На мой взгляд, будет две vtables и только один vptr. Я прав на это?

4

Решение

Стандарт не определяет, как фактически реализуются виртуальные функции, только то, как они должны вести себя. То, что вы просите, полностью зависит от используемого вами компилятора.


GCC теоретически, скорее всего, создаст две vtables (одна для B и один для D) и три vptrs (по одному для каждого экземпляра объекта d1, d2, d3).

Посмотрите здесь: http://en.wikipedia.org/wiki/Virtual_method_table

7

Другие решения

Вы можете найти детали реализации в документации вашего компилятора.
Это может варьироваться от версии к версии, даже между платформами.

Для gcc в Linux вполне вероятно, что каждому экземпляру D понадобится свой vptr и один vtable.

У вас есть 3 экземпляра D:

  • У каждого будет свой vptr -> 3 vptr
  • Каждый указывает на один и тот же vtable.

Итак, 3 vptr и 1 vtable (+1 vtable для B, что здесь бесполезно).

Опять это детали реализации, и в вашем очень простом случае это требует оптимизации компилятора.

4

В типичной реализации виртуального полиморфизма на основе таблиц будут:

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

Так что здесь будет две vtables (для B а также D) и три вптр (в *d1, *d2 а также *d3). Если компилятор не заметит, что вы не используете объекты, a полностью их устраняет.

2
По вопросам рекламы [email protected]