我对虚拟对象的大小有一些疑问。
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......
看来在这种情况下,布局中有两个vptr......这是怎么回事?我认为这两个 vptr 一个用于 A 类,另一个用于 B 类....所以 C 类的虚函数没有 vptr?
我的问题是,关于继承中 vptr 数量的规则是什么?
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
sizeof D 为 28 是否意味着 28 = 16(B 类) + 16(C 类) - 8(A 类) + 4 (这是什么?)
我的问题是,为什么应用虚拟继承时会有额外的空间?
在这种情况下,对象大小的基本规则是什么?
将 virtual 应用于所有基类和部分基类有什么区别?