Рассмотрим код ниже:
#...
class A {};
class B: public A{};
class C: virtual public A{};
class D: virtual public C{};
// No More Classes
...
int _tmain(int argc, _TCHAR* argv[]) {
cout<<sizeof(A)<<" ";
cout<<sizeof(B)<<" ";
cout<<sizeof(C)<<" ";
cout<<sizeof(D)<<".";
...
}
O / P: 1 1 4 8.
Вопрос:
*. Это мой первый вопрос, пожалуйста, поправьте меня, если вы нашли что-то не так.
Короче говоря, это не потому, что класс является виртуальным или нет, а потому, что стандарт требует, чтобы все объекты различались по их адресу памяти. Смотрите этот вопрос:
Объявление 1. См. Ответ PeddleSpam
ad 2. IIRC компилятор помещает в так называемый VMT больше информации, чем просто указатели виртуальных функций. Еще одна информация — это положение виртуального A в C, я думаю.
Объявление 3. См. 2.