Сколько 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. Я прав на это?
3 ответа
Стандарт не определяет, как фактически реализуются виртуальные функции, только то, как они должны вести себя. То, что вы просите, полностью зависит от используемого вами компилятора.
GCC теоретически, скорее всего, создаст две vtables (одна для B
и один для D
) и три vptrs (по одному для каждого экземпляра объекта d1
, d2
, d3
).
Посмотрите здесь: http://en.wikipedia.org/wiki/Virtual_method_table
Вы можете найти детали реализации в документации вашего компилятора. Это может варьироваться от версии к версии, даже между платформами.
Для gcc в Linux вполне вероятно, что каждому экземпляру D понадобится свой vptr и один vtable.
У вас есть 3 экземпляра D:
- У каждого будет свой vptr -> 3 vptr
- Каждый указывает на один и тот же vtable.
Итак, 3 vptr и 1 vtable (+1 vtable для B, что здесь бесполезно).
Опять же, это деталь реализации, и в вашем очень простом случае она подлежит оптимизации компилятором.
В типичной реализации виртуального полиморфизма на основе таблиц будут:
- один vtable на класс, содержащий указатели виртуальных функций и другие метаданные для этого класса;
- один vptr на объект, указывающий на виртуальную таблицу для типа динамического класса этого объекта.
Так что здесь будет две vtables (для B
а также D
) и три вптр (в *d1
, *d2
а также *d3
). Если компилятор не заметит, что вы не используете объекты, a полностью их устраняет.