C++对象模型之内存布局(2)

多重继承

继承关系大于2,至少有父类,子类,孙子类三代关系。 

class A
{
public:
	A(int a1 = 0, int a2 = 0) {};
	~A() {};
	virtual void A1() { cout << "A::A1() " << endl; };
	virtual void A2() { cout << "A::A2() " << endl; };
	virtual void A3() { cout << "A::A3() " << endl; };

protected:
	int a1;
	int a2;
};

class B : public A
{
public:
	B(int a1 = 0, int a2 = 0, int b1 = 0) {};
	~B() {};
	virtual void B1() { cout << "B::B1() " << endl; };
	virtual void B2() { cout << "B::B2() " << endl; };
	virtual void A1() { cout << "B::A1() " << endl; };

protected:
	int b1;
};

class C : public B
{
public:
	C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
	~C() {};
	virtual void C1() { cout << "C::C1() " << endl; };
	virtual void B2() { cout << "C::B2() " << endl; };
	virtual void A1() { cout << "C::A1() " << endl; };

protected:
	int c1;
};

使用VS2017查看对象内存布局如下: 

class C size(20):
        +---
 0      | +--- (base class B)
 0      | | +--- (base class A)
 0      | | | {vfptr}
 4      | | | a1
 8      | | | a2
        | | +---
12      | | b1
        | +---
16      | c1
        +---

C::$vftable@:
        | &C_meta
        |  0
 0      | &C::A1
 1      | &A::A2
 2      | &A::A3
 3      | &B::B1
 4      | &C::B2
 5      | &C::C1

实例验证:

#include <iostream>
using namespace std;

class A
{
public:
	A(int a1 = 0, int a2 = 0) {};
	~A() {};
	virtual void A1() { cout << "A::A1() " << endl; };
	virtual void A2() { cout << "A::A2() " << endl; };
	virtual void A3() { cout << "A::A3() " << endl; };

protected:
	int a1;
	int a2;
};

class B : public A
{
public:
	B(int a1 = 0, int a2 = 0, int b1 = 0) {};
	~B() {};
	virtual void B1() { cout << "B::B1() " << endl; };
	virtual void B2() { cout << "B::B2() " << endl; };
	virtual void A1() { cout << "B::A1() " << endl; };

protected:
	int b1;
};

class C : public B
{
public:
	C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
	~C() {};
	virtual void C1() { cout << "C::C1() " << endl; };
	virtual void B2() { cout << "C::B2() " << endl; };
	virtual void A1() { cout << "C::A1() " << endl; };

protected:
	int c1;
};


typedef void(*pfun)(); //函数指针
int main()
{
	C *bp = new C;
	pfun fun = NULL;

	for (size_t i = 0; i < 6; i++)
	{
		fun = (pfun)*((long *)*(long*)bp + i);
		fun();
	}
	cout << *((long *)*(long*)bp + 5) << endl;
	system("PAUSE");
}

运行结果:  

C::A1()
A::A2()
A::A3()
B::B1()
C::B2()
C::C1()
1512644
请按任意键继续. . .

与对象内存布局图一致。

多继承

一个子类的父类不止一个,定义三个类

class A
{
public:
	A(int a1 = 0, int a2 = 0) {};
	~A() {};
	virtual void A1() { cout << "A::A1() " << endl; };
	virtual void A2() { cout << "A::A2() " << endl; };
	virtual void A3() { cout << "A::A3() " << endl; };

protected:
	int a1;
	int a2;
};

class B
{
public:
	B(int b1 = 0) {};
	~B() {};
	virtual void B1() { cout << "B::B1() " << endl; };
	virtual void B2() { cout << "B::B2() " << endl; };

protected:
	int b1;
};

class C : public A, public B
{
public:
	C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
	~C() {};
	virtual void C1() { cout << "C::C1() " << endl; };
	virtual void B1() { cout << "C::B1() " << endl; };
	virtual void A1() { cout << "C::A1() " << endl; };

protected:
	int c1;
};

 

 

class C size(24):
        +---
 0      | +--- (base class A)
 0      | | {vfptr}
 4      | | a1
 8      | | a2
        | +---
12      | +--- (base class B)
12      | | {vfptr}
16      | | b1
        | +---
20      | c1
        +---

C::$vftable@A@:
        | &C_meta
        |  0
 0      | &C::A1
 1      | &A::A2
 2      | &A::A3
 3      | &C::C1

C::$vftable@B@:
        | -12
 0      | &C::B1
 1      | &B::B2

多继承的内存布局与单继承和多重继承不一样,子类继承一个父类,子类就有一个虚函数表,当子类继承两个父类时,子类就有两个虚函数表,而且子类自己定义的虚函数放在第一个继承的虚函数表中。

实例验证:

#include <iostream>
using namespace std;

class A
{
public:
	A(int a1 = 0, int a2 = 0) {};
	~A() {};
	virtual void A1() { cout << "A::A1() " << endl; };
	virtual void A2() { cout << "A::A2() " << endl; };
	virtual void A3() { cout << "A::A3() " << endl; };

protected:
	int a1;
	int a2;
};

class B
{
public:
	B(int b1 = 0) {};
	~B() {};
	virtual void B1() { cout << "B::B1() " << endl; };
	virtual void B2() { cout << "B::B2() " << endl; };

protected:
	int b1;
};

class C : public A, public B
{
public:
	C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
	~C() {};
	virtual void C1() { cout << "C::C1() " << endl; };
	virtual void B1() { cout << "C::B1() " << endl; };
	virtual void A1() { cout << "C::A1() " << endl; };

protected:
	int c1;
};


typedef void(*pfun)(); //函数指针
int main()
{
	C *bp = new C;
	pfun fun = NULL;

	cout << "A的虚函数表" << endl;
	for (size_t i = 0; i < 4; i++)
	{
		fun = (pfun)*((long *)*(long*)bp + i);
		fun();
	}
	cout << "B的虚函数表" << endl;
	long* cp = (long*)bp + 3;
	for (size_t i = 0; i < 2; i++)
	{
		fun = (pfun)*((long *)*(long*)cp + i);
		fun();
	}
	cout << *((long *)*cp + 2) << endl;
	system("PAUSE");
}

运行结果:

A的虚函数表
C::A1()
A::A2()
A::A3()
C::C1()
B的虚函数表
C::B1()
B::B2()
0
请按任意键继续. . .

 与对象内存布局图一致。

参考文档:https://mp.weixin.qq.com/s/UQhTAXIHffN3Now4_utb6g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值