条款32:确定你的public继承塑模出is-a模型

class D(derived)以public形式继承class B(base),则每一个类型为D的对象同时也是一个类型为B的对象,反之不成立,因此B比D表现出更加一般化的概念,而D比B表现出更特殊化的概念。在C++领域里面,任何函数如果希望获得一个类型为B的实参,都也愿意接受一个类型为D的对象,这就是is-a(是一种)的关系;代码分享:

class ractangle{

public:

virtual void setheight(int newheight);

virtual void setwidth(int newwidth);

virtual int height( ) const;

virtual int width( ) const;

};

void makebigger(rectangle &r){

int oldheight=r.height( );

r.setwidth(r.width( )+10);

assert(r.height()==oldheight);//assert为真

}

class square:public rectangle{ ...};

square s;

assert(s.width()==s.height( ));//assert为真

makebiggle(s);

assert(s.width()==s.height( ));//asseert为真 ,为什么s没有发生变化;

在本例分析中,某些可施行在矩形身上的事情(宽度可独立于高度被修改)却没办法施行在正方形身上(宽度和高度一样),但public主张,能够施行在base class对象上的每一件事情,都能施行于derived class对象上,所以正方形和矩形的例子中不满足is-a模型;pulic就意味着is-a模型,因此在继承中确定你的class之间的关系,并合理塑造它们

条款33:避免遮掩继承而来的名称(继承而导致的作用域问题)

在public继承中,derived class中的成员函数会将base class中重名的成员函数覆盖掉,从而出现因继承导致成员函数调用问题;因此使用public继承但又不继承那些重载函数,这就违背了public继承中的is-a原则;

如果你想继承base class并加上重载函数,而你希望重新定义或者复写其中一部分,那么你必须为那些原本会被遮掩的每个名称引用一个using的声明,否则某些你希望继承的名称会被遮掩;

如果derived以private方式继承的base,如果使用using声明,那么给定名称的函数会在derived中都可见,这并不是我们希望达到的目的,这时候我们可以使用一个简单的转交函数;

class base{

public:

virtual void mf1()=0;

virtual void mf1(int);

...

};

class derived:private base {

public:

virtual void mf1( ){//转交函数

        base::mf1( );//inline函数

}

};

条款34:区分接口继承和实现继承

public继承分为函数接口继承和函数实现继承;

1)对于pure virtual函数,它有两个特性,它们必须被任何“继承了它们”的具象class重新声明,而且它们在抽象class中通常没有定义,因此声明一个pure virtual函数的目的是为了derived class只继承接口(只具体接口继承)

引申:我们可以给pure virtual函数提供定义,也就是说你可以给base中的pure virtual函数提供一份实现代码,C++并不会发出警告和错误,但调用它的唯一途径就是:调用时明确指出其class路径;(一直以为pure virtual函数不能在base内实现)

         2)derived class继承函数接口,但是impure virtual函数会提供一份实现代码,derived class可能会赋写它;声明简朴的impure virtual 函数的目的,是让derived classes继承该函数的接口和缺省实现(具体指定接口继承和缺省实现继承);

         如果在继承过程中,derived class中没有重新定义virtual class,那么就默认使用base class中的virtual函数;如果两个class都共享着一份相同的性质,可以把这份相同的性质搬到base class中,从而避免代码重复,这是典型的面向对象的设计方法;

3)对于一个non-virtual函数,意味着它并不打算在derived class中有不同的行为,实际上一个non-virtual成员函数所表现出来的不变性凌驾其特异性,因此不管derived class变得多特异化,它的行为都不可以被改变;声明一个non-virtual函数的目的是为了令derived class继承函数的接口及一份强制性的实现(具体指定接口及强制性实现继承);

Effective C++学习第九天相关推荐

  1. Query框架学习第九天:jQuery工具函数介绍与使用

    j jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用j ...

  2. jQuery框架学习第九天:jQuery工具函数介绍与使用

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  3. Effective C++ 学习笔记 第七章:模板与泛型编程

    第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...

  4. effective c++ 学习

    <Effective C++> 目录: 转自:http://blog.csdn.net/KangRoger/article/details/44706403 目录 条款1:视C++为一个语 ...

  5. Effective C++学习第十一天

    条款41:了解隐式接口和编译期多态 面向对象编程世界总是以显式接口(源码可见的接口)和运行期多态(virtual)解决问题:对于templates及泛型编程的世界,隐式接口和编译期多态显得更加重要: ...

  6. java零基础学习第九天

    今天我们主要学习面向对象的最后一个知识点:接口,以及常用的一些设计模式,内部类以及Lambda表达式. 一.接口 接口是一种特殊的抽象类 1.接口的优点: 定义开发规范:提高代码的复用性:解耦:多实现 ...

  7. More effective C++学习总结

    More effective C++摘要 3 基础议题部分: 3.1 M1:指针与引用的区别 首先,要认识到在任何情况下都不能使用指向空值的引用,引用必须被初始化.一个引用必须总是指向某些对象. (不 ...

  8. 【Effective C++ 学习笔记】

    条款02:尽量以const,enum,inline替换 #define #define定义的常量也许从未被编译器看见,也许在编译器开始处理源码之前它就被预处理器移走了: #define不重视作用域,不 ...

  9. Java:Effective java学习笔记之 考虑实现Comparable 接口

    Java 考虑实现Comparable 接口 考虑实现Comparable 接口 1.Comparable接口 2.为什么要考虑实现Comparable接口 3.compareTo 方法的通用约定 4 ...

最新文章

  1. python timber_如何使用Timber更有效地记录日志
  2. 线程:suspend与resume方法
  3. 个人技术博客Alpha----Android Studio UI学习
  4. PIL修改带有透明像素的png图片颜色
  5. 一维稳态导热的数值计算c语言,传热传质上机实习题(参考资料C语言)
  6. MongoDB管理与监控
  7. JAVA中反射机制五(JavaBean的内省与BeanUtils库)
  8. 合沟微服务怎么添加_如何在微服务中使用webservice?
  9. 基于jQuery动画二级下拉导航菜单
  10. 微信小程序发送模板消息限制的问题
  11. MFC入门到精通1-创建项目
  12. 10个WEB设计戒律 和 10个设计师戒律
  13. STM32F103ZET6硬件资源简介
  14. Slf4j与Log4j的区别
  15. cesium polygon添加边界线不起作用
  16. cad两直线相交画圆弧_CAD两直线,如何用圆弧连接?
  17. iptables ip 白名单操作
  18. 肖特基二极管与普通二极管的区别
  19. Tensor (张量) - 神经网络中的数据结构
  20. 数据时代的我们,应该怎么挖掘数据价值

热门文章

  1. Netty中的策略者模式
  2. 父类作为方法的形参以及父类作为方法返回值
  3. uoj#351. 新年的叶子(概率期望)
  4. [开源JVM] yvm - 自制Java虚拟机
  5. 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
  6. 圆形坠落模拟算法设计
  7. antd 表格树如何展开_如何分析工作,找出规律,使用excel大幅度提高工作效率...
  8. hashmap为什么用红黑树_要看HashMap源码,先来看看它的设计思想
  9. linux下iostat命令无效,linux iostat命令详解
  10. 小程序沉浸式_企业开发小程序:客户裂变式增长