- 单一普通类模型
class A
{
};
class A size(1):
+---
+---
- 单一普通继承模型
class A
{
};
class B : public A
{
};
class B size(1):
+---
0 | +--- (base class A)
| +---
+---
- 单一基类虚函数继承模型
class A
{
public:
virtual int funA() {}
};
class B : public A
{
};
class B size(4):
+---
0 | +--- (base class A)
0 | | {vfptr}
| +---
+---
- 单一基类虚函数继承派生类虚函数模型
class A
{
public:
virtual int funA() {}
};
class B : public A
{
public:
virtual int funB() {}
};
class B size(4):
+---
0 | +--- (base class A)
0 | | {vfptr}
| +---
+---
- 多继承普通基类类虚函数基类类继承模型
class A
{
public:
};
class B
{
public:
virtual int funB() {}
};
class C : public A, public B
{
public:
};
class C size(4):
+---
0 | +--- (base class B)
0 | | {vfptr}
| +---
4 | +--- (base class A)
| +---
+---
- 多继承虚函数基类普通基类继承模型
class A
{
public:
};
class B
{
public:
virtual int funB() {}
};
class C : public B, public A
{
public:
};
class C size(4):
+---
0 | +--- (base class B)
0 | | {vfptr}
| +---
4 | +--- (base class A)
| +---
+---
- 多继承普通基类虚函数基类继承派生类虚函数
class A
{
public:
};
class B
{
public:
virtual int funB() {}
};
class C : public A, public B
{
public:
virtual void funC() {}
};
class C size(4):
+---
0 | +--- (base class B)
0 | | {vfptr}
| +---
4 | +--- (base class A)
| +---
+---
- 多继承普通虚基类,虚函数虚基类,派生类虚函数
class A
{
public:
};
class B : virtual public A
{
public:
};
class C : virtual public A
{
public:
virtual void funC() {}
};
class D
{
public:
virtual void funD() {}
};
class E : public B, public C, public D
{
public:
virtual void funE() {}
};
class E size(16):
+---
0 | +--- (base class C)
0 | | {vfptr}
4 | | {vbptr}
| +---
8 | +--- (base class D)
8 | | {vfptr}
| +---
12 | +--- (base class B)
12 | | {vbptr}
| +---
+---
+--- (virtual base A)
+---
class E : public B, public D, public C
{
public:
virtual void funE() {}
};
class E size(16):
+---
0 | +--- (base class D)
0 | | {vfptr}
| +---
4 | +--- (base class C)
4 | | {vfptr}
8 | | {vbptr}
| +---
12 | +--- (base class B)
12 | | {vbptr}
| +---
+---
+--- (virtual base A)
+---
总结:
测试对象模型里说的,当多个基类时,第一个基类没有虚函数,第二个及以后的基类有虚函数则替换第一个基类。可以减少一个vfptr。这个一开始不理解。后来实测下来突然懂了,他减少的是派生类的vfptr。他将后续的vfptr和派生类可能存在的vfptr合并在一起了。真的nb这群鬼才。一个类属于自己的空间只能有一个虚函数和虚基类。