Я использую VS 2013 и пытаюсь увидеть, как vptr и vftable работают на уровне объекта. Итак, у меня есть следующие классы:
#include<iostream>
using namespace std;
class baseClass
{
public:
void nonVirtualFunc() {}
virtual void virtualNonOverriddenFunc() {}
virtual void virtualOverriddenFunc() {}
};
class derivedClass : public baseClass
{
public:
virtual void virtualOverriddenFunc() {}
virtual void derivedClassOnlyVirtualFunc() { cout << "derivedClass" << endl; }
};
int main(int argc, char** argv) {
derivedClass derivedClassObj2;
cout << "Size of derivedClassObj: " << sizeof(derivedClassObj2) << endl;
return 0;
}
И вот что я вижу при отладке:
Теоретически должно быть ДВА vptrs. Один для vftable базового класса и один для производного класса для отслеживания недавно добавленного производного классаOnlyVirtualFunc().
Но, как видите, есть только один vptr/vftable. Но механизм работает исправно.
Я думал, что есть второй vptr, который я не вижу в окне просмотра, поэтому я распечатал размер объекта. Это 4 байта, указывающие, что присутствует только один указатель.
Итак, как это работает с недавно добавленной виртуальной функцией?
Согласно это должно быть два vptrs.
РЕДАКТИРОВАТЬ: я проверил содержимое памяти vftable, как предложил Серж, и действительно есть три записи. По какой-то причине оно не отображается в отладчике.
Ваше здоровье.
baseClass
, а виртуальная таблицаbaseClass
содержит только две записи. - person Raymond Chen   schedule 02.12.2014