C++对象模型 -- 关于对象的概述

一、C++对象模型中,非静态数据成员被配置于每一个对象之内,而静态数据成员以及静态与非静态成员函数都是北被放置在所有Class Object之外的。其他的Virtual Function (虚函数) 则是以下面两个步骤来支持:

    1. 每个类产生一堆指向虚函数的指针放置在虚表之中;

    2. 每个class object之内被添加了一个指针vptr,指向相关的虚表。vptr的设定和重置都由构造函数、析构和拷贝分配运算符自动完成。每一个class关联的type_info object通常放在表格的第一个slot处。

    (在程序内部,对虚函数的访问全部都是被转换成vptr对虚表的访问。)

 

二、多态的性质只有通过指针或者引用才能发挥作用;

        

    多态的主要用途是经由一个共同的借口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。

 

三、表现一个类对象需要的内存空间由以下几点决定:

       1. 其非静态数据成员的总和大小;

       2. 加上任何由于系统最小表示大小的内存填充需求而附加的空间;

       3. 加上为了支持virtual而由内部产生的任何额外负担。

    一个指针不管它指向哪一种数据类型,指针本身所需的内存大小是固定的一个word。加上继承和多态以后,内存空间就要首先附加上基类的内存空间,然后再开始子类的内存空间计算。(子类只有一个虚表)

 

四、 子类指针和父类指针有什么不同呢?

       

     ap所涵盖的地址只包含B对象中的父类A所有的部分,而bp所涵盖的地址包含整个B对象。ap是不能直接畜类B中的任何成员的,唯一例外的是通过virtual机制来实现。即ap调用虚函数时候,被赋予B类虚函数的特性。

       

    可是初始化函数在将一个对象拷贝到另一个对象的时候,为什么a的vptr没有指向b的虚表呢?原来编译器在初始化和制定操作之间做了仲裁,编译器必须确保如果某个对象含有一个或更多的vptrs,那些vptrs的内容不会被基类的初始化或者改变。至于为什么a会调用A::fun(),这个在上面已经介绍过了。

 

上面内容是在阅读《C++对象模型》时的读书笔记,做一个简单的总结,以便整体的理解和以后的回顾。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值