Может кто-нибудь объяснить мне, что здесь происходит? Во-первых, я думаю, что большинство программистов знают, что класс с виртуальной функцией имеет vtbl и, следовательно, имеет 4 дополнительных байта в верхней части. Насколько я знаю, это довольно стандартно. Я проверил это и воспользовался этим, прежде чем выполнять загрузку из двоичного файла с исправленными vtbls. В течение последних 6 месяцев я работал в Xcode и совсем недавно столкнулся с необходимостью сделать что-то загрузочное на месте, поэтому я снова начал искать исправления vtbls. Просто чтобы убедиться, что мое понимание верно, я написал пример программы. Вот оно:
class A
{
public:
virtual int getData()
{
return a;
}
virtual void print()
{
printf("hello\n");
}
int a;
};
class B : public A
{
public:
int getData()
{
return b;
}
int b;
};
class C : public B
{
public:
int getData()
{
return c;
}
void print()
{
printf("world\n");
}
int c;
};
class D
{
public:
int a;
int b;
};
int main (int argc, const char * argv[])
{
A* tA = new A();
tA->a = 1;
printf("A: %d\n", sizeof(A));
printf("A data: %d\n", tA->getData());
B* tB = new B();
tB->a = 2;
tB->b = 4;
printf("B: %d\n", sizeof(B));
printf("B data: %d\n", tB->getData());
C* tC = new C();
tC->c = 8;
printf("C: %d\n", sizeof(C));
printf("C data: %d\n", tC->getData());
A* aC = tC;
aC->print();
printf("D: %d\n", sizeof(D));
return 0;
}
Мой ожидаемый результат был:
A: 8
Данные: 1
B: 12
B данные: 4
C: 16
C данные: 8
мир
D: 8
Однако вывод, который я получаю:
A: 16
Данные: 1
B: 16
B данные: 4
C: 24
C данные: 8
мир
D: 8
Кто-нибудь знает, что здесь происходит? Спасибо!