深度探索C++对象模型 第1章 关于对象

本文围绕C++对象展开,介绍了简单对象模型、表格驱动对象模型,阐述无继承和有继承下的C++对象模型,包括数据成员和函数的存放位置、虚函数的处理等。还说明了对象模型对程序的影响,以及struct与class关键字、多态继承后对象的差异。

第1章 关于对象

1.1 c++对象模型

在这里插入图片描述
一、简单对象模型:将指向data member与member function的指针放入到object中,member本身并不放在object中
在这里插入图片描述
二、表格驱动对象模型:object’中包含两个指针,分别指向data member table与function member table
在这里插入图片描述

三.1 无继承下的C++对象模型

  • 非静态数据成员存放在每一个类对象之内
  • 静态数据成员存放在所有的类对象之外
  • 非静态/静态成员函数都放置在所有的类对象之外
  • 虚函数存放分为两个步骤:
    • 1.每一个类为每一个虚函数都分别产生一个虚函数的指针,然后将这些指针放在一个虚函数表中(virtual table,vtbl)。虚函数表的第一个位置存放着所指对象的类型,用于运行时类型识别(runtime type identification,RTTI)
    • 2.每一个类在内部添加一个指针(vptr),该指针指向于虚函数表
      在这里插入图片描述

三.2 有继承下的C++对象模型

  • 创建一个表,表中存放着指向基类的指针,然后派生类中又存放着这个表的指针
  • 如果有虚继承,因为虚继承中只保存一份基类的实例,因此虚继承的子类所属的继承表中都指向同一个基类(虚继承是为了防止菱形继承时产生的数据命名重复
class istream:virtual public ios{}; //虚继承
class ostream:virtual public ios{}; //虚继承

class iostream:public istream,public ostream{};

在这里插入图片描述

四 对象模型如何影响程序

不同的对象模型,会导致“现有的程序代码必须修改”以及“必须加入新的程序代码”两个结果

  • 演示案例
  • class X定义了一个拷贝构造函数、一个虚析构函数、一个虚函数foo
    在这里插入图片描述
X foobar()
{
	X xx;
	X *px = new X;
	xx.foo();
	px->foo();
 
	delete px;
	return xx;
}

因此我们可以将上面的代码在内部可能会被转换为如下形式(我们会在后面的文章详细介绍每一步操作的用意):

X foobar()
{
	//构造_result
	//_result用来取代local xx
	_result.X::X();
 
	//扩展X *px=new X;
	px = _new(sizeof(X));
	if (px != 0)
		px->X::X();
 
	//扩展xx.foo()但不使用virtual机制
	//以_result取代xx
	foo(&_result);
 
	//使用virtual机制扩展px->foo()
	(*px->vtbl[2])(px);
 
	//扩展delete px
	if (px != 0){
		(*px->vtbl[1])(px);
		_delete(px);
	}
 
	//不需要named return statement
	//不需要摧毁local objext xx
	return;
}

1.2 关键词所带来的差异

struct与class关键字接近,struct的保留可以说是为了方便c语言迁移至c++

1.3 对象的差异

多态继承后,以动物园zooAnimal为例,Bear是其中一种动物,继承代码如下:

class Bear: public ZooAnimal {
public:
	Bear();
	...
}

则内存布局如下:指针pb覆盖的地址包含整个Bear Object,而指针pz只覆盖了Bear Object的ZooAnimal subobject。
除了ZooAnimal subobject中出现的members,但不能使用指针pz来直接处理Bear的任何members,除非通过virtual机制
在这里插入图片描述

s/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值