我对使用虚函数时对象大小有一些疑问。
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。
这是否意味着即使B类和A类都有虚函数,也只有一个vptr在那里?为什么只有一个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.....这是怎么发生的?我认为其中一个vptr是用于类A,另一个是用于类B....所以对于类C的虚函数没有vptr?
我的问题是,在继承中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();
};
A的大小为8。
B的大小为16。
C的大小为16。
D的大小为28。这是否意味着28 = 16(类B)+16(类C)-8(类A)+4(这是什么?)
我的问题是,在应用虚拟继承时为什么会有额外的空间?
在这种情况下,对象大小的底层规则是什么?
当所有基类和部分基类应用虚拟继承时有什么区别?