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