У меня есть некоторые вопросы о размере объекта с виртуальным.
1) виртуальная функция
class A {
public:
int a;
virtual void v();
}
Размер класса A составляет 8 байтов.... одно целое (4 байта) плюс один виртуальный указатель (4 байта) Это ясно!
class B: public A{
public:
int b;
virtual void w();
}
Каков размер класса B? Я тестировал с использованием sizeof B, он печатает 12
Означает ли это, что существует только один vptr, хотя оба класса B и класса A имеют виртуальную функцию? Почему существует только один vptr?
class A {
public:
int a;
virtual void v();
};
class B {
public:
int b;
virtual void w();
};
class C : public A, public B {
public:
int c;
virtual void x();
};
Размер C равен 20........
Кажется, что в этом случае два виттера находятся в макете..... Как это происходит? Я думаю, что два vptrs один для класса A, а другой для класса B.... так что нет vptr для виртуальной функции класса C?
Мой вопрос: какое правило о количестве vptrs в наследовании?
2) виртуальное наследование
class A {
public:
int a;
virtual void v();
};
class B: virtual public A{ //virtual inheritance
public:
int b;
virtual void w();
};
class C : public A { //non-virtual inheritance
public:
int c;
virtual void x();
};
class D: public B, public C {
public:
int d;
virtual void y();
};
Размер A равен 8 байтам -------------- 4 (int a) + 4 (vptr) = 8
Размер B равен 16 байтам -------------- Без виртуального должно быть 4 + 4 + 4 = 12. Почему здесь есть еще 4 байта? Какое расположение класса B?
Размер C равен 12 байтам. -------------- 4 + 4 + 4 = 12. Ясно!
Размер D равен 32 байтам -------------- должно быть 16 (класс B) + 12 (класс C) + 4 (int d) = 32. Правильно ли это?
class A {
public:
int a;
virtual void v();
};
class B: virtual public A{ //virtual inheritance here
public:
int b;
virtual void w();
};
class C : virtual public A { //virtual inheritance here
public:
int c;
virtual void x();
};
class D: public B, public C {
public:
int d;
virtual void y();
};
sizeof A равно 8
sizeof B - 16
sizeof C равен 16
sizeof D равно 28 Означает ли это 28 = 16 (класс B) + 16 (класс C) - 8 (класс A) + 4 (что это?)
Мой вопрос: почему существует дополнительное пространство при применении виртуального наследования?
Что такое нижнее правило для размера объекта в этом случае?
Какая разница, когда виртуальное приложение применяется ко всем базовым классам и к части базовых классов?