c++学习_1
最近重新捧起了《Effective c++》,其中味道又有不同,这里记录之。。。
这篇文章记录一下public继承的知识点...
(1)public继承的意义
该继承方式是代表is-a(是一种)的关系,即施加于基类的所有操作,同样能施加于派生类;换句换说,比如存在类A(person)和类B(student),且类B以public的方式继承于类A,那么可以说类B对象也是类A对象的一种,那么能施加于类A(person)的操作(比如eat),必然能施加于类B上;如果不满足这种关系,就不能用public继承,而需要考虑其他设计,来约束这两个类之间的关系。以上就是public继承的意义之所在,明白这个意义能够指导,能否直接将一个object以public的方式继承于另一个object!!!
(2)public继承的实质
在设计继承体系时,对于函数属性的设置往往令人头痛,到底是设置为virtual还是non-virtual呢,有时还会因为是否将一个类设为abstract class而耿耿于怀,以上这些问题的出现,表示我们还没有弄明白继承体系中,这些属性设置的真正含义之所在。这里还要记录一下public继承自身的特点,即父类中public属性的成员(成员函数和成员变量)被子类继承后,依然是public属性;private属性和protected属性以此类推。
下面就一个例子来说明public继承的实质:
class A{
public:
//...(省略构造函数和析构函数)
virtual void pureVirFunc() const = ;
virtual void virFunc() const;
void nonVirFunc() const;
private:
//...(省略成员变量)
};
上述类A定义了三个成员函数,代表三种属性的函数,即纯虚函数,非纯虚函数和非虚函数;这三种函数在继承时有着各自的行为,这些行为代表着继承的实质。
class B : public A{
public:
//...(省略构造函数和析构函数)
virtual void pureVirFunc() const;
virtual void virFunc() const;
// 对于类A中的nonVirFunc函数,这里
// 不能重写
private:
//...
};
简单阐述三种函数继承时的行为:
1.纯虚函数——类A将pureVirFunc设置为纯虚函数,表明类A是一个abstract class,它不能产生具体的对象,肆意去生成类A的对象的行为是愚蠢的,但能够声明它的指针,用其指针指向具体的派生类对象,达到动态绑定的效果,如此:
----------------------------------------------------
A a; //错误,不能为abstract class生成具体对象
A* pa = new B();//正确
pa->virFunc(); //动态绑定,调用的是类B的函数
----------------------------------------------------
类A将pureVirFunc设置为纯虚函数,以此来告知各位子类(以public的方式继承于类A),对于该函数对应的行为,它只是声明函数接口(子类们也只能继承该接口的声明),具体如何实现那是子类们自己的事情。当然,C++也给予那些多事的abstract class一个方便——能为纯虚函数提供显示的定义;但是,由于子类必须重写纯虚函数(不然,子类也是abstract class),这样看来,abstract基类为纯虚函数提供显示定义似乎没有必要,因为子类根本用不上。的确,除了用来耍酷,一般是用不上的,不过,《Effective c++》中阐述了一种情况,为纯虚函数提供显示定义的行为是有必要。
2.非纯虚函数——较之纯虚函数,一般的虚函数更常用,毕竟大部分对象时具体的,就应该能让它们产生对象;父类赋予某个函数的属性为impure virtual时,一般会附带默认的实现,该情况对应上面例子中的virFunc函数,即告知其子类,该行为对应的函数,它提供了函数接口声明,并附上其默认实现,如果默认实现能完成某个子类的需要的功能,那么该子类直接继承而不需重写该函数;不然,就需要重写该函数,来满足自己的需求。大部分情况下,子类对于父类提供的默认实现都不太满意,会重写继承而来的impure virtual函数,以此来体现继承体系中的多态性。
3.非虚函数——如果父类将某个行为定义为非虚函数,该情况对应上面例子中的nonVirFunc函数,即告知各位子类,它提供了该行为对应的函数接口声明和必要的实现,并且该函数的实现能满足子类的需求(即便以后发生其他变化),它不希望子类们自以为是的去重写这类函数。反过来想,如果父类提供的实现不能满足子类未来的需求,那就应该将该函数声明为虚函数而不是非虚函数了,对吧?
c++学习_1的更多相关文章
- 数塔~~dp学习_1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- linux驱动学习_1
目前项目需要,需要做linux驱动了,记录一下 学习驱动,大家一定都会写一个hello world代码,网上也有很多范例,但是记录一下遇到的问题. 1.make之后,使用insmod加载,终端没有打印 ...
- Linux下C编程的学习_1
0x0:为什么写这个系列的文章 博客原本的定位是安卓游戏的破解,可是为什么写这系列的文章呢? 由于在破解过程中,我们是无法避免来敲代码的,恢复算法,模拟算法,游戏中对数据的解密.游戏中对保存在clie ...
- Verilog HDL学习_1:分频器/PWM的实现
(一)参考学习资料 (二)实际操作 1. 相关变量计算: First Initial Second Initial Upper case H X ASCII (Dec) 72 88 Lengths ...
- 《windows程序设计》学习_1:初识windows程序
#include<windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szC ...
- python学习_1
1.python2和python3 从宏观上讲,python2源码不标准.混乱.重复,和龟叔的理念背道而驰. 在python3上,实现了源码的统一化和标准化,去除了重复的代码. 2.编译型语言和解释型 ...
- 【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)
前言: PCA是大家经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的.本文通过使用PCA来提取人脸中的特征脸这个例子,来熟悉下在oepncv中怎样使用PCA这个类. ...
- Tensorflow_入门学习_1
1.0 TensorFlow graphs Tensorflow是基于graph based computation: 如: a=(b+c)∗(c+2) 可分解为 d=b+c e=c+2 a=d∗e ...
- 6-网页,网站,微信公众号基础入门(PHP学习_1)
https://www.cnblogs.com/yangfengwu/p/11037675.html 安装PhpStrom http://www.jetbrains.com/phpstorm/ 然后百 ...
随机推荐
- IntelliJ IDEA 14.x 创建工作空间与多个Java Web项目
以往的Eclipse.NetBeans等开发工具不同,IDEA的Project相当与Eclipse的Workspace,而Module相当于Project. 下边就给出Eclipse与IDEA的概念的 ...
- Silverlight应用程序中调用WCF Ria Services访问数据库图片
WCF Ria Services(通常称为RIA服务),专门设计让Silverlight应用程序访问数据库,网上有关其示例应用都是基于简单的数据显示,其中MSDN网站上有详细的解决方案介绍,地址htt ...
- hibernate持久化操作注意
15:05 2014/5/21 1.设置lazy为false可以立即加载配合get,lazy默认true,配合load使用. 2.把pojo类定义为final的类.为最终就可以不使用代理 3.pojo ...
- Codeforces Round #359 div2
Problem_A(CodeForces 686A): 题意: \[ 有n个输入, +\space d_i代表冰淇淋数目增加d_i个, -\space d_i表示某个孩纸需要d_i个, 如果你现在手里 ...
- js数值计算
js在小数数值计算时会出现误差,比如0.19+15.02=15.20999999999999,出现此问题的原因,百度上有,为了避免误差产生可以这样做:(0.19*100+15.02*100)/100.
- BZOJ 3956 Count 解题报告
好点对的个数是\(O(n)\)的,而且我们可以 \(O(n)\) 地求出所有好点对. 我们把这些点对以右端点为关键字从小到大排序,再弄个扫描线,每次把右端点在扫描线上的点对的左端点加入线段树,于是我们 ...
- 解决win8 plsql无法登录
今天安装完oracle客户端,然后打开 plsql 之后,就一个提示框,提示没有登录,后来解决方法如下: 在plsql的图标上点右键,以管理员身份运行,即可! 如果不想一直点右键执行,就图标上点右键- ...
- POJ 3274 Gold Balanced Lineup(哈希)
http://poj.org/problem?id=3274 题意 :农夫约翰的n(1 <= N <= 100000)头奶牛,有很多相同之处,约翰已经将每一头奶牛的不同之处,归纳成了K种特 ...
- JAVA三大框架的各自作用
http://christhb.blog.163.com/blog/static/98982492011727114936239/ 一.Spring Spring是一个解决了许多在J2EE开发中常见的 ...
- ANDROID_MARS学习笔记_S02_004_ExpandableListActivity
1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...