IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++对象模型 之 关于对象 -> 正文阅读

[C++知识库]C++对象模型 之 关于对象

关于对象

布局负担

  • virtual function 机制 用以支持一个有效率的“执行期绑定”(runtime binding)
  • virtual base class 用以实现“多次出现在继承体系中的base class, 有一个单一而被共享的实体”

C++ 对象模式

//Point class  definination
class Point
{
public: 
     Point (float xval);
     virtual ~Point();
	
	 float x() const;
	 static int PointCount();
	
Protected:
     virtual ostream& print(ostream &os) const;
		
	float _x;
	static int _point_count;
};

简单对象模型

简单对象模型

表格驱动对象模型

Member Table对象模型

C++对象模型

  • 非静态成员被置于每一个class object之内
  • 静态成员被存放在所有class object 之外
  • 静态和非静态成员函数也被存于class object 之外
  • Virtual functions布局
    C++对象模型

虚函数和虚函数表

  • vtbl(virtual table)
    每一个class 产生出一堆指向 virtual functions 的指针,放在表格之中。这个表格被称为 virtual table
  • vptr (virtual table ptr)
    每一个class object被添加了一个指针,指向相关的virtual table。 通常这个指针被称为ivptr. vptr的设定(setting)和 重置(resetting) 都由每一个class 的 构造,析构,拷贝运算符自动完成。
  • type_info
    每一个class 所关联的type_info object也;经由virtual table被指出来
    vtbl的

C++如何支持多态

  • 1.经过隐式的转化操作, 例如将一个派生类指针转化成一个指向基类的指针
// example 1
shape *ps = new circle();
  • 2.经由virtual function的机制
ps->rotate( ) 
  • 3.经由dynamic_cast 和 typeid运算符
if ( circle *pc = dynamic_cast<circle *>(ps))

类对象占用内存计算

  • 需要多少内存才能变现一个class object?
  1. 其非静态成员变量总大小
  2. 对齐需要填补的空间
  3. 未支持virtual 而由内部产生的任何额外负担
//动物园
class ZooAnimal
{
public:
	ZoonAnimal();
	virtual ~ZoomAnimal();
	//...
	virtual void rotate();

protected:
    int loc;
    String name;	
};

ZoonAnimal za("Zoey");
ZoonAnimal *pza = &za;

ZoomAnimal 对象占用内存图

多态下对象占用内存情况

class Bear: public ZoomAnimal
{
public:
 	Bear();
 	~Bear();
 	//...
 	void rotate();
 	virtual void dance();
 	//...
 protected:
   enum Dances{ ... }
   Dance dance_know;
   int cell_block;
};

Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;

Bear派生类内存分配

ZooAnimal 和 Bear 关系1

Bear b;
ZooAnimal *pz = &b;
Bear *pb = &b;
  • 每个都指向Bear 对象b 的第一个byte;
  • 差别:pb 涵盖整个Bear obj, pz 所涵盖的地址只包含Bear 对象b中的ZoomAnimal subobject

合法的操作:

if( Bear *pb2 = dynamic_cast<Bear *>(pz))
{
	 pb2->cell_block;
}

ZooAinmal 和 Bear 关系2

Bear b;
ZoomAnimal za = b;
//调用ZooAnimal:: rotate()
za.roate();
  • 问题1:为什么rotate()调用的是ZoomAnimal实例而不是Bear实例?
    答: za 并不(而且也绝不会是)一个Bear, 它是(并且只能是)一个ZooAnimal

  • 问题2 : 为什么za的vptr不指向Bear 的 virtual table?
    答: 编译器在初始化和指定(assignment)操作(将一个class object指定给另一个class object)之间做出了判断。 编译器必须确保如果某个object含有一个或一个以上的vtprs, 那些vptrs的内容不会被base class object初始化或改变

ZooAnimal, Bear 和 Panda 关系3

{
	ZooAnimal za;
	ZooAnimal *pza;

	Bear b;
	Panda *pp = new Panda;

	pza = &b;
}

ZooAnimal, Bear, Panda

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:24:21  更:2022-01-25 10:25:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:28:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码