最近重新捧起了《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的更多相关文章

  1. 数塔~~dp学习_1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  2. linux驱动学习_1

    目前项目需要,需要做linux驱动了,记录一下 学习驱动,大家一定都会写一个hello world代码,网上也有很多范例,但是记录一下遇到的问题. 1.make之后,使用insmod加载,终端没有打印 ...

  3. Linux下C编程的学习_1

    0x0:为什么写这个系列的文章 博客原本的定位是安卓游戏的破解,可是为什么写这系列的文章呢? 由于在破解过程中,我们是无法避免来敲代码的,恢复算法,模拟算法,游戏中对数据的解密.游戏中对保存在clie ...

  4. Verilog HDL学习_1:分频器/PWM的实现

    (一)参考学习资料 (二)实际操作 1. 相关变量计算:   First Initial Second Initial Upper case H X ASCII (Dec) 72 88 Lengths ...

  5. 《windows程序设计》学习_1:初识windows程序

    #include<windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szC ...

  6. python学习_1

    1.python2和python3 从宏观上讲,python2源码不标准.混乱.重复,和龟叔的理念背道而驰. 在python3上,实现了源码的统一化和标准化,去除了重复的代码. 2.编译型语言和解释型 ...

  7. 【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)

    前言: PCA是大家经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的.本文通过使用PCA来提取人脸中的特征脸这个例子,来熟悉下在oepncv中怎样使用PCA这个类. ...

  8. Tensorflow_入门学习_1

    1.0 TensorFlow graphs Tensorflow是基于graph based computation: 如: a=(b+c)∗(c+2) 可分解为 d=b+c e=c+2 a=d∗e ...

  9. 6-网页,网站,微信公众号基础入门(PHP学习_1)

    https://www.cnblogs.com/yangfengwu/p/11037675.html 安装PhpStrom http://www.jetbrains.com/phpstorm/ 然后百 ...

随机推荐

  1. nodejs基础安装

    安装Nodejs需要从官网上下载一个最新的安装包,运行.我这里是win764位系统. 下载版本6.5.0 由于去外国的镜像上下载东西比较慢,淘宝为我们准备了国内的镜像.我们需要安装国内镜像的使用工具. ...

  2. tableView -- tips

    1. 如果发现TableView的第一个sectionHeader不显示, 那么可以断定, 你没有用代理方法来设置 sectionHeader的高度! #pragma mark - delegate ...

  3. 仿window阿里旺旺登陆界面,打印机吐纸动画效果-b

    偶然的机会发现window的阿里旺旺的登陆效果蛮有意思的,于是就模仿着做了一下打印机吐纸的动画效果看起来很神奇的东西,实现起来却不难,下面我给大家看下主要的源码. - (void)createUI{ ...

  4. linux nginx安装

    操作系统centOS7安装nginx: 1.如果centOS7中未安装编译器,先安装gcc编译模块 yum install gcc gcc-c++ ncurses-devel perl 2.安装ngi ...

  5. java对xml文件做增删改查

    http://www.cnblogs.com/wangchenyang/archive/2011/08/23/2150530.html http://www.blogjava.net/weishuan ...

  6. CF 217 B. Berland Bingo

    http://codeforces.com/contest/370/problem/B 题意 :呃,这个题我说不清楚....就是有n个人,第 i 个人手里有 mi 张牌,如果,现在主人念数,念到哪张牌 ...

  7. CF Codeforces Round #231 (Div. 2)

    http://codeforces.com/contest/394 话说这次CF做的超级不爽,A题一开始交过了,我就没再管,B题还没看完呢,就死困死困的,后来觉得B题枚举一下估计能行,当时是觉得可以从 ...

  8. [状压dp]HDOJ1565 方格取数(1)

    中文题~~ 题意略 $n\le 20$ ! 很明显是状压! #include <cstdio> #include <cstdlib> #include <cstring& ...

  9. GridView使用CommandField删除列实现删除时提示确认框

    在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除 GridView在使用CommandField删除时弹出提示 ...

  10. 第五章 HID设备

    5.1 HID介绍 为简化USB设备的开发过程,USB提出了设备类的概念.所有设备类都必须支持标准USB描述符和标准USB设备请求.如果有必要,设备类还可以自行定义其专用的描述符和设备请求,这分别被称 ...