C ++: виртуальное наследование

Рассмотрим код ниже:

#...
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. sizeof (A) = 1 байт, и это расположение содержит то, что важно для компилятора / нас.
  2. Зачем компилятору добавлять vptr в объект класса C, когда на самом деле ничего нет.
  3. Если у нас нет виртуальной функции, компилятор добавляет дополнительный vptr к производным объектам.

*. Это мой первый вопрос, пожалуйста, поправьте меня, если вы нашли что-то не так.

5

Решение

Короче говоря, это не потому, что класс является виртуальным или нет, а потому, что стандарт требует, чтобы все объекты различались по их адресу памяти. Смотрите этот вопрос:

Почему размер пустого класса в C ++ не равен нулю?

8

Другие решения

Объявление 1. См. Ответ PeddleSpam

ad 2. IIRC компилятор помещает в так называемый VMT больше информации, чем просто указатели виртуальных функций. Еще одна информация — это положение виртуального A в C, я думаю.

Объявление 3. См. 2.

0

По вопросам рекламы [email protected]