C++面向对象类的书写相关细节梳理
类的问题
继承类的原因:为了添加或者替换功能。
1. 继承时重写类的方法
v 替换功能
① 将所有方法都设置为virtual(虚函数),以防万一。
Virtual:经验表明最好将所有方法都设置为virtual,包括析构函数但不包括构造函数;
这样不必担心重写方法是否运行,这样做唯一的缺点是对性能具有轻微的影响;
即使某个类不大可能被扩展,最好还是将这个类的方法设置为virtual,以防万一。
② 重写方法的语法:在子类定义中重新声明这个方法,并在子类的实现文件中提供新的定义。(注意:方法定义中不需要重复使用virtual关键字)
③ 指针或者引用可以指向某个类的的对象或者子类的对象。例如:如果有一个对父类Super引用,而实际引用的是子类Sub对象,那么调用其中的方法实际上是调用子类版本的方法。
父类:Super类;
子类:Sub类;
Sub mySub;
Super& ref = mySub;
ref.someMethod(); //此处调用的是子类的someMethod()方法
如果在父类中省略了virtual关键字,重写功能将无法完成。
④ 即使父类的引用或者指针知道这实际上是一个子类,也无法访问没有在父类中定义的子类的方法或者成员。例如:
someOtherMethod( )是子类Sub的方法,父类没有该方法;
Sub mySub;
Super& ref = mySub;
Ref.someOtherMethod(); //BUG
mySub.someOtherMethod(); //可以执行
⑤ 非指针非引用对象是无法正确处理子类的特征信息。例如:
Sub mySub;
Super assignedObject = mySub;
assignedObject.someMethod(); //此处最多只会调用父类Super的someMethod()方法。
⑥ 总结:父类的指针或者引用指向子类对象时,子类保留其重写方法;但是如果通过类型转换将子类对象转换为超类对象,此时会丢失其特征,重写方法以及子类数据的丢失成为截断。
⑦ 将方法标记为final,这意味着无法在子类中重写这个方法。例如:
Virtual void someMethod() final;
2. 如何使用继承重用代码
v 在某个方法对于类的所有实例都相同时,便考虑将该方法设置为静态方法;
v
3. 利用父类
当编写一个子类时,需要知道父类以及子类之间的交互方式。创建顺序、构造函数链以及类型转换都是潜在的bug来源。
v 创建顺序
① 如果某个类具有基类,执行基类的默认构造函数。
② 类的非静态数据成员按照声明的顺序创建。
③ 执行该类的构造函数。
v 析构函数调用顺序
① 调用类的析构函数。
② 销毁类的数据成员,与创建的顺序想发。
③ 如果有父类,调用父类的析构函数。(所有析构函数都声明为virtual?????)
v 根据经验,所有析构函数都应该声明为virtual。例如:
v 从子类向父类传递构造函数的参数是正常的,但是无法传递数据成员。(如果这么做了,代码可以编译,但是记住在调用父类构造函数之后数据成员才会初始化,如果将数据成员作为参数传递给父类构造函数,数据成员不会被初始化。)
v 在子类中重写了父类中的某个方法时,如果想在重写方法中调用父类的该方法,一定要注意添加父类作用域,否则会执行无限循环。例如:
Sting MyWeatherPrediction::getTemperature( ) const
{
Return WeatherPrediction::getTemperature( ) + “F”; //一定要在此处添加父类作用域
}
4. 父类、子类之间的转换
v 向上转型(即子类转父类)
当向上转型时,使用父类指针或者引用可以避免截断。
v 向下转型(即父类转子类),注意事项:
以上不实用,以下才是正确方法。
v 仅在必要的情况下才使用向下转型,并且一定要使用dynamic_cast。
继承与多态性
1. 类的多态性
v 在实际操作中,我们的代码是否很少用到类的多态性这一属性,实际上类的多态性是如此的好用。
以上的设计显示了让SpreadsheetCell层次结构具有多态性的方法。由于DoublSpreadsheetCell以及StringSpreadsheetCell都是从同一个父类SpreadsheetCell继承,从其他代码的角度来看,他们是可以互换的。实际上这意味着:
l 两个子类都支持由基类定义的同一接口(方法集)。
l 使用SpreadsheetCell对象的代码可以调用接口中的任何方法,而不需要知道这个单元格式是StringSpreadsheetCell还是DoublSpreadsheetCell。
l 由于虚方法的特殊能力,会根据对象所属的类调用接口中每个方法的正确实例。
l 其他数据结构可以通关过引用父类类型包含多种类型的单元格。
v 注意要合理的利用类的多态性这一属性,需要考虑以下一些问题:
① 在设计基类的时候,应该考虑子类之间的关系;根据这些信息,可以提取共有特性并将其放到父类中。
② 纯虚方法:纯虚方法在类定义中显示说明该方法不需要定义;因为这种基类是没有实例的(如果某个类包含了一个或者多个纯虚方法,那么就无法构建这种类型的对象);采用专门的语法指定纯虚方法:方法声明后紧接着=0;在.CPP文件中不需要编写任何代码。例如:
③ 抽象基类:以上提到的基类,便是抽象基类,是无法实例化的;但是可以使用抽象基类的指针或者引用,因为实际上指向的是子类对象。
抽象类提供了一种禁止其他代码直接实例化对象的方法,而它的子类可以实例化对象。
C++面向对象类的书写相关细节梳理的更多相关文章
- oopday01(面向对象-类&private&this)
面向对象基本概述.封装 01_面向对象(面向对象思想概述) * A:面向过程思想概述 * 第一步 * 第二步 * B:面向对象思想概述 * 找对象(第一步,第二步) * C:举例 ...
- ~~核心编程(二):面向对象——类&属性~~
进击のpython 类&属性 虽然我们上一part写了一个面向对象的程序:人狗大战 但是如果在面向对象来看 你这些的就不够规范 你既然选择用面向对象的思想来写 那你就要符合人家的定义规范和操作 ...
- Nao 类人机器人 相关资料
Nao 类人机器人 相关资料: 1.兄妹 PEPPER :在山东烟台生产,http://www.robot-china.com/news/201510/30/26564.html 2.国内机器人领先公 ...
- Php面向对象 – 类常量
Php面向对象 – 类常量 类常量:类中,保存执行周期内,不变的数据. 定义: constkeyword const 常量名 = 常量值 样例: class Student { public $st ...
- C语言利用 void 类型指针实现面向对象类概念与抽象。
不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...
- Python学习(七)面向对象 ——类和实例
Python 面向对象 —— 类和实例 类 虽然 Python 是解释性语言,但是它是面向对象的,能够进行对象编程.至于何为面向对象,在此就不详说了.面向对象程序设计本身就很值得深入学习,如要了解,请 ...
- php面向对象类中常用的魔术方法
php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...
- Java面向对象-类与对象
Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...
- C++面向对象类的实例题目十
题目描述: 编写一个程序,其中有一个汽车类vehicle,它具有一个需要传递参数的构造函数,类中的数据成员:车轮个数wheels和车重weight放在保护段中:小车类car是它的私有派生类,其中包含载 ...
随机推荐
- WEKA,一个开源java的数据挖掘工具
开始研究WEKA,一个开源java的数据挖掘工具. HS沉寂这么多天,谁知道偏偏在我申请离职的时候给我安排了个任务,哎,无语. 于是,今天看了一天的Weka. 主要是看了HS提供的三个文章(E文,在g ...
- python 类型转换函数
python提供了一些可将某个值从一种类型转换为另一种类型的内置函数. 1. int函数可以把任何可以转换为整型的值转换为整型.int可以将浮点数转换为整数,但不会做四舍五入操作,而是直接丢弃小数部分 ...
- Android入门第十六篇之Style与Theme [转]
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.. ...
- 加入功能区buttonRibbon Button到SP2010特定列表或库
加入功能区button到SP2010某一列表或库 有时候你须要给列表/库的功能区加入新button--没有什么比这更简单的了. 你仅仅须要新建一个SP项目.加入一个feature,加入 ...
- VIM中格式化json
在vim输入以下命令就可以格式化:%!python -m json.tool可以在~/.vimrc增加快捷键map <F4><Esc>:%!python -m json.too ...
- Lc.exe已退出 代码为-1问题解决方法
对于用vs作为开发工具的同学来说,可能常常会碰到“Lc.exe已退出 代码为-1”的问题,造成这个结果的一般是因为加入了第三方的插件程序造成的,今天一一讲解如何解决. 工具/原料 vs各版本开发工具 ...
- hdu 1524 A Chess Game 博弈
题目链接 给出一个有向无环图, 上面放有一些棋子, 两个人轮流移动棋子, 当一个人无法移动时, 算输. 求出每一个点的sg值, 异或就可以.出度为0的点sg值为0. #include<bits/ ...
- hdu 4493 Tutor
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4493 给你十二个月的工资,算平均数,保留两位,去除末尾的0 使用暴力解决,嘻嘻,但是这题主要是在进位这个地 ...
- android studio 实现代码混淆
=======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...
- 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/
前言 Android Studio(以下简称AS)在13年I/O大会后放出预览版到现在放出的正式版1.0(PS.今天又更新到1.0.1了)历时一年多了,虽然Google官方推出的Android开发者的 ...