Информация о классе хранится в таблице символов. Как следующий код:
#include<iostream>
#include <typeinfo>
using namespace std;
class Base {
public:
Base() { }
virtual void test(){ }
};
class Derived: public Base {
};
int main() {
// print Derived's info
Base* b = new Derived;
const char* str = typeid(*b).name();
cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;
// print Base's info
str = typeid(Base).name();
cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;
return 0;
}
Скомпилируйте этот файл с помощью g ++ и запустите:
7Derived's address = 0x400e68
4Base's address = 0x400e98
Исполняемый файл - «a.out», и используйте команду «readelf -a a.out» для получения дополнительной информации:
Symbol table '.symtab' contains 98 entries:
Num: Value Size Type Bind Vis Ndx Name
......
79: 0000000000400e68 9 OBJECT WEAK DEFAULT 15 _ZTS7Derived
80: 0000000000400e98 6 OBJECT WEAK DEFAULT 15 _ZTS4Base
......
Итак, определение класса занимает некоторую память, и эта информация может быть доступна из виртуальной таблицы.