C++面向对象的设计思想——小结
1 对象的概念
面向对象(Object Oriented Analysis Design,OOAD)的思想把整个世界看成是由具有某种特征行为功能的基本单元——对象构成的。OOAD把一个对象的特征称为属性,把其行为称为一种方法。一个对象,可以接受外部信息,也可以向外部提供某种服务,我们可以将参数传递给对象,请求对象处理之后返回给我们,即提供了服务。
2 信息的隐藏与封装
C++与C基本的改变就是把函数和数据放进了结构之中,即C++类。为了达到隐藏的目的,C++提供了private、protected和public声明哪些东西能否以及如何被访问。
虽然C++类很好用,当也不能一股脑儿都把不相干的数据和函数放到类中,要遵循最小化原则。
3 类的继承特性
什么是对象?对象就是类的一个实例(instance),如果把类比作房子的图纸,那么类就是建好的房子。
什么是派生类和基类?派生类继承了基类的全部数据和函数,并具有自己私有的数据和函数,是“is a”的关系。比如人是一个基类,那么男人就是他的派生类,男人也是人。
4 动态特性
绝大部分情况下,程序的功能在编译之后固定下来了,我们称之为静态特性。相对的,如果是运行时才确定下来的,则称之为动态特性。
动态特性主要包括:虚函数、抽象基类、动态绑定和多态(polymorphism)等等。
4.1 虚函数
有时候为了结构统一和管理方便,在基类定义一个接口函数,派生类分别继承并覆盖了这一接口函数。在运行时,动态的确定该用哪一个派生类的函数。这样的函数称为虚函数。一旦一个类里的某个函数被声明成了虚函数,那么其派生类的对应函数也会成为虚函数。
为了提高程序的清晰性,最好在每个派生类显示的声明虚函数(加virtual关键字)。
4.2 抽象基类
如果将基类的虚函数声明为纯虚函数后该类就变成了抽象基类。方法是将虚函数“初始化”为0(在后边添加“=0”),这样告诉编译器:不要为该函数编址,阻止类的实例化。
抽象基类的设计思想是“接口与实现分离”,因为抽象基类将数据和实现都隐藏在了实现类中,所以又被称为接口类。
4.3 动态绑定
理解动态绑定首先需要知道以下概念:
- 绑定:将函数体和函数调用关联起来(一般通过函数指针)
- 早绑定:在程序运行之前,即编译和链接是执行的绑定
- 晚绑定:即动态绑定。在运行时,基于不同类型的对象,对函数调用不同的函数体是发生的绑定。
如果一个语言要实现动态绑定必须有某种机制去确定对象的具体类型,然后调用适当的成员函数。为了达到动态绑定的效果,派生类和基类中同名的函数必须要有相同的原型。
4.4 运行时多态
因为派生类和基类是“is a”的关系,所以一个派生类也可以当成一个基类来使用。因此这些派生类对象在面对同一个函数调用的时候会有不同的反应,这就是运行时的多态。
C++实现运行时多态的方法有:
- 经过隐式转换,令一个基类指针指向它的一个派生类对象
- 通过这个指针调用基类的虚函数
- 使用dynamic_cast<>和typeid运算符
综合使用C++的虚函数和多态,有如下突出的优点:
- 只需要完成一次基类的调用,而不是完成每一个派生类的调用
- 派生类的功能可以被基类指针引用,即向后兼容
4.5 多态数组
不要在数组中直接存放多态对象,换之以基类指针。
- 通过基类指针删除一个优派生类对象组成的数组,结果将是未定义的!(内存空间问题)
- 多态和指针算术运算不可混用,因此多态和数组不可混用
5 C++对象的内存模型
5.1 对象的内存映象
以两个简单的多态类为例
//基类A
class A{
public:
A(){...};
~A(){...};
virtual void func1() = ;
private:
int a;
static int b;
}; //派生类B
class B : public A{
public:
B(){...};
~B(){...};
virtual void func1(){...};
void func2(){...};
private:
int c;
static int d;
};
一个基本的对象模型有如下几个规则:
- 非静态数据成员被放在每一个对象体内,为对象所专有
- 静态数据成员放在程序的静态存储区内被该类所有对象共享,因此只存在一份
- 静态或非静态成员函数放在程序的代码段内被该类所有对象共享,因此也只存在一份
- 类类嵌套定义的各种类型(如typedef、class、struct、union、enum等)和放在类外面的定义除了作用域不同外没有本质的区别
构成对象本身的只有数据,任何成员函数都不属于任何一个对象。非静态成员函数与对象的关系就是绑定,绑定的中介是this指针。
- 派生类继承基类的非静态成员
- 每一个多态类都创建一个虚函数指针数组(vtable),该类所以虚函数(继承的或新增的)的地址都保存在这张表里
- 多态类的每一个对象都有一个类型为指向函数指针的指针——vptr,它总是指向所属类的vtable
- 如果基类已经插入了vptr,则派生类将继承和重用vptr
- 如果派生类从多个多态基类继承,则派生类将在每个继承分支上继承多个vptr,生成对应的多个vtable数组
- vptr在派生类对象中的相对位置不会因为继承层次的增加而改变
- 为了支持RTTI,为每一个多态类创建一个type_info对象,并将其地址保存在vtable中的固定位置(一般在首部)
派生类B的对象模型如下图所示:

C++面向对象的设计思想——小结的更多相关文章
- 面向对象设计思想和MVC设计模式
虽然之前学习Java时有接触过面向对象的设计思想,但因当时Java没学好.所以导致这两天讲php的面向对象设计时,感到没有头绪,这也反应了我练习少和逻辑能力的不足.而MVC设计思想 面向对象就是要将系 ...
- linux设备驱动的分层设计思想--input子系统及RTC
转自:linux设备驱动的分层设计思想 宋宝华 http://blog.csdn.net/21cnbao/article/details/5615493 1.1 设备驱动核心层和例化 在面向对象的程序 ...
- python 面向对象设计思想发展史
这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...
- 面向对象的编程思想和Java中类的概念与设计
面向对象的编程思想学习,面向对象内容的三条主线;1.java类及类的对象2.面向对象的三大特征3.其他关键字学习内容:3.1面向对象与面向过程面向对象与面向过程在应用上的区别 Java中类的概念与设计 ...
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- javascript继承机制的设计思想(ryf)
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
- Volley设计思想和流程分析
本文是对Volley思路的整体整理,并不是Volley教程,建议有Volley使用经验,但是对Volley整体不是很清楚的同学阅读. 我认为,弄清整体的流程很重要,以避免一叶障目不见泰山的囧境,而对于 ...
- javascript 继承机制设计思想
作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_java ...
- 转:Javascript继承机制的设计思想
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
随机推荐
- LINQ(Language Integrated Query)
LINQ http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html LINQ是.NET Framework 3.5的新特性,其全称 ...
- C# 重命名文件方法
. //重命名文件 // 改名方法 FileInfo fi = new FileInfo("旧路径"); //xx/xx/aa.rar fi.MoveTo("新路径&qu ...
- 常用 CSS 选择器
// css 读取顺序从右到左,符合要求的都会匹配 // 通配符选择器 -- 选择所有元素 * // 通配符选择器 -- 选择某个元素下的所有元素 .demo * // 元素选择器 html,body ...
- CSV文件模块的使用
---恢复内容开始--- 1.CSV模块使用流程 1.导入模块 impport CSV 2.打开文件(xxx.csv) with open('xxx.csv','a',encoding='utf-8' ...
- Amaze UI的一点总结
做一个微信公众号内的网页的时候,用到了Amaze UI,也称妹子UI. 官网上宣称,Amaze UI中国首个开源 HTML5 跨屏前端框架,用下来的感觉是比较类似于bootstrap,都是移动端优先. ...
- MySQL主主高可用(keepalive)
2台新的虚拟机172.16.1.1.172.16.1.2 (配置yum源 ) 安装数据库服务 其中 172.16.1.1.172.16.1.2运行数据库服务并设置数据库管理员从本机登录的密码是xzw ...
- 网站出现502 bad getway
最近项目之余,领导叫解决下系统网站经常出现502的问题,作为小头头的我,怎能不顶上. 流程开始走起,先查nginx,嗯,配置是大众的.是不是缓存溢出了呢.调节buffer的值 .貌似也没什么影响啊.5 ...
- 数据结构(5) 第五天 快速排序、归并排序、堆排序、高级数据结构介绍:平衡二叉树、红黑树、B/B+树
01 上次课程回顾 希尔排序 又叫减少增量排序 increasement = increasement / 3 + 1 02 快速排序思想 思想: 分治法 + 挖坑填数 分治法: 大问题分解成各个小问 ...
- linux下RTP编程(使用JRTPLIB)(转)
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...
- Jquery学习总结(5)——jQuery选择器
1. #id : 根据给定的ID匹配一个元素 <p id="myId">这是第一个p标签</p> <p id="not">这 ...