C++多态和对象的内存布局(二)

续  C++多态和对象的内存布局(一)

 

5. 普通单继承且本身不存在虚函数的继承类的内存布局

程序输出:
sizeof(Base_1) = 12   (成员属性 + 指向虚函数表的指针)
sizeof(Derive_1) = 20 (Base成员属性 + Derive成员属性 + 指向虚函数表的指针)


Base内存布局:
1>  class Base_1    size(12):
1>      +---
1>   0    | {vfptr}
1>   4    | base1_1
1>   8    | base1_2
1>      +---

Base虚函数表:
1>  Base_1::$vftable@:
1>      | &Base_1_meta
1>      |  0
1>   0    | &Base_1::base1_fun_1
1>   1    | &Base_1::base1_fun_2 
 
Derive内存布局:
1>  class Derive_1    size(20):
1>      +---
1>   0    | +--- (base class Base_1)
1>   0    | | {vfptr}
1>   4    | | base1_1
1>   8    | | base1_2
1>      | +---
1>  12    | derive1_1
1>  16    | derive1_2
1>      +---


Derive虚函数表:
1>  Derive_1::$vftable@:
1>      | &Derive_1_meta
1>      |  0
1>   0    | &Base_1::base1_fun_1
1>   1    | &Base_1::base1_fun_2

测试代码:

#include<iostream>
#include<string>
 
using namespace std;
 
class Base_1
{
public:
    int base1_1;
    int base1_2;	
 
    virtual void base1_fun_1() 
	{
		cout << "virtual void Base_1_fun_1()" << endl;
	}
    virtual void base1_fun_2() 
	{
		cout << "virtual void Base_1_fun_2()" << endl;
	}
};
 
class Derive_1 : public Base_1
{
public:
    int derive1_1;
    int derive1_2;
};
 
int main()
{
	cout << endl << "5. 普通单继承且本身不存在虚函数的继承类的内存布局" << endl;
	
	cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;	
	cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;	
	
	return 0;
}

6. 本身存在虚函数基类也存在虚函数

Base内存布局:
1>  class Base_1    size(12):
1>      +---
1>   0    | {vfptr}
1>   4    | base1_1
1>   8    | base1_2
1>      +---

Base虚函数表:
1>  Base_1::$vftable@:
1>      | &Base_1_meta
1>      |  0
1>   0    | &Base_1::Base_1_fun_1
1>   1    | &Base_1::Base_1_fun_2

Derive内存布局:
1>  class Derive_1    size(20):
1>      +---
1>   0    | +--- (base class Base_1)
1>   0    | | {vfptr}
1>   4    | | base1_1
1>   8    | | base1_2
1>      | +---
1>  12    | derive1_1
1>  16    | derive1_2
1>      +---

Derive虚函数表:
1>  Derive_1::$vftable@:
1>      | &Derive_1_meta
1>      |  0
1>   0    | &Base_1::Base_1_fun_1
1>   1    | &Base_1::Base_1_fun_2
1>   2    | &Derive_1::Derive_1_fun_1   

测试代码:

#include<iostream>
#include<string>
 
using namespace std;
 
class Base_1
{
public:
    int base1_1;
    int base1_2;	
 
    virtual void Base_1_fun_1() 
	{
		cout << "virtual void Base_1_fun_1()" << endl;
	}
    virtual void Base_1_fun_2() 
	{
		cout << "virtual void Base_1_fun_2()" << endl;
	}
};
 
class Derive_1 : public Base_1
{
public:
    int derive1_1;
    int derive1_2;
	
	virtual void Derive_1_fun_1() 
	{
		cout << "virtual void Derive_1_fun_1()" << endl;
	}
};
 
int main()
{
	cout << endl << "6. 本身存在虚函数基类也存在虚函数" << endl;
	
	cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;	
	cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;	
	
	return 0;
}

 

7. 普通单继承中派生类本身不存在虚函数,是派生类用普通方法重载基类的虚函数
 

      这里只讲内存布局,多态后续详解
 程序输出:
 sizeof(Base_1) = 12
 sizeof(Derive_1) = 20

Base内存布局
1>  class Base_1    size(12):
1>      +---
1>   0    | {vfptr}
1>   4    | base1_1
1>   8    | base1_2
1>      +---
Base虚函数表
1>  Base_1::$vftable@:
1>      | &Base_1_meta
1>      |  0
1>   0    | &Base_1::Base_1_fun_1
1>   1    | &Base_1::Base_1_fun_2
1>
1>  Base_1::Base_1_fun_1 this adjustor: 0
1>  Base_1::Base_1_fun_2 this adjustor: 0
1>
1>  class std::is_error_code_enum<char const *>    size(1):
1>      +---
1>   0    | +--- (base class std::integral_constant<bool,0>)
1>      | +---
1>      +---

Derive内存布局:
1>  class Derive_1    size(20):
1>      +---
1>   0    | +--- (base class Base_1)
1>   0    | | {vfptr}
1>   4    | | base1_1
1>   8    | | base1_2
1>      | +---
1>  12    | derive1_1
1>  16    | derive1_2
1>      +---

Derive虚函数表
1>  Derive_1::$vftable@:
1>      | &Derive_1_meta
1>      |  0
1>   0    | &Derive_1::Base_1_fun_1  已经被放置到第一位,&Derive_1 由这个可知 Derive_1生命的对象指向的是Derive_1类中的函数Base_1_fun_1。
1>   1    | &Base_1::Base_1_fun_2

测试代码:

#include<iostream>
#include<string>

using namespace std;

class Base_1
{
public:
    int base1_1;
    int base1_2;	

    virtual void Base_1_fun_1() 
	{
		cout << "virtual void Base_1_fun_1()" << endl;
	}
    virtual void Base_1_fun_2() 
	{
		cout << "virtual void Base_1_fun_2()" << endl;
	}
};

class Derive_1 : public Base_1
{
public:
    int derive1_1;
    int derive1_2;
	
	void Base_1_fun_1() 
	{
		cout << "virtual void Derive 重载 Base_1_fun_1()" << endl;
	}
};

int main()
{
	cout << endl << "6. 本身存在虚函数基类也存在虚函数" << endl;
	
	cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;	
	cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;	
	
	return 0;
}

 

8. 普通单继承中派生类本身存在虚函数,是派生类用虚函数方法重载基类的普通函数

Base内存布局:
1>  class Base_1    size(12):
1>      +---
1>   0    | {vfptr}
1>   4    | base1_1
1>   8    | base1_2
1>      +---

Base虚函数表:
1>  Base_1::$vftable@:
1>      | &Base_1_meta
1>      |  0
1>   0    | &Base_1::Base_1_fun_1

Derive内存布局:
1>  class Derive_1    size(20):
1>      +---
1>   0    | +--- (base class Base_1)
1>   0    | | {vfptr}
1>   4    | | base1_1
1>   8    | | base1_2
1>      | +---
1>  12    | derive1_1
1>  16    | derive1_2
1>      +---

Derive虚函数表:
1>  Derive_1::$vftable@:
1>      | &Derive_1_meta
1>      |  0
1>   0    | &Base_1::Base_1_fun_1
1>   1    | &Derive_1::Base_1_fun_2

 

#include<iostream>
#include<string>

using namespace std;

class Base_1
{
public:
    int base1_1;
    int base1_2;	

    virtual void Base_1_fun_1() 
	{
		cout << "virtual void Base_1_fun_1()" << endl;
	}
    void Base_1_fun_2() 
	{
		cout << "virtual void Base_1_fun_2()" << endl;
	}
};

class Derive_1 : public Base_1
{
public:
    int derive1_1;
    int derive1_2;
	
	virtual void Base_1_fun_2() 
	{
		cout << "virtual void Derive 重载 Base_1_fun_2()" << endl;
	}
};

int main()
{
	cout << endl << "8. 本身存在虚函数基类也存在虚函数" << endl;
	
	cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;	
	cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;	
	
	return 0;
}

 

 

 

未完待续....

C++多态和对象的内存布局(一)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值