《Effective C++》继承与面对对象设计:条款32-条款40

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

  • public继承意味着is-a。适用于base class身上的每一个函数也一定适用于derived class。

条款33:避免遮掩继承而来的名称

几层作用域:

  • global作用域

    • namespace作用域

      • Base class作用域

        • Drive class作用域

          • 成员函数

            • 控制块作用域

当前作用域会遮掩上一层作用域的名称(重载的函数也会直接遮掩)

class Base{
public:
    void f1();
}

class Drive : public Base {
public:
    void f1(int);  //会遮掩f1(),子类并没有继承f1()
}

Drive d;
d.f1();  //错误
d.f1(3); //正确

可以通过using声明式(public继承)或者inline转交(public和private继承)解决这一问题

class Base{
public:
    void f1();
}

//using 声明式
class Drive:public Base {
public:
    using Base::f1;
    void f1(int);
}

//inline转交
class Drive : private Base {
public:
    void f1(){
        Base::f1();
    }
    void f1(int);
}

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

  • 纯虚函数(只提供接口)

    • 纯虚函数造成了抽象类,抽象类不可以构造实体(对象)
    • Drived class中必须给出纯虚函数的实现
    • 纯虚函数可以给出实现(类外)
  • 虚函数(提供接口和缺省实现)
    • 用于实现多态
  • 非虚函数(提供了强制实现)
    • 可以看成此类独有,且最好不要在Drived class重新定义非虚函数

条款35:考虑virtual函数以外的其他选择

条款36:绝不重新定义继承而来的non-virtual函数

条款37:绝不要重新定义继承而来的缺省参数值

条款38:通过复合塑模树has-a 或“根据某物实现出”

条款39:明智而审慎的使用private继承

条款40:明智而审慎的使用多重继承

原文地址:https://www.cnblogs.com/narjaja/p/10209196.html

时间: 2024-10-10 16:28:03

《Effective C++》继承与面对对象设计:条款32-条款40的相关文章

《设计模式之禅》笔记整理--面对对象设计六大原则

第一章.面对对象设计六大原则: (1).单一职责原则:应该有且只有一个原因引起类的变更. 为什么要用单一职责原则:(1).类的复杂性降低,实现什么职责都有清晰明确的定义. (2).可读性提高,复杂性降低,当然可读性提高了. (3).可维护性提高,可读性提高,当然更容易维护了. (4).变更引起的风险降低,一个接口修改,只对相应的实现类有影响. 职责划分的例子:电话过程可以划分为两个职责:(1).协议管理(2).数据传送 :RBAC模型,基于角色的访问控制 (2).里氏替换原则:目的:增强程序的健

JAVA程序设计(07.3)-----面对对象设计 时钟

1.面对对象设计 时钟的类  3种录入方式(重载) package com.lovo; import java.text.DecimalFormat; import java.util.Calendar; /** * 时钟 类 * @author Abe * */ /** * 属性, 小时,分钟,秒 * * @author Abe * */ public class Clock { private int hour; private int min; private int sec; /** *

JAVA程序设计(09)-----面对对象设计初级应用 龟兔赛跑

1.乌龟和兔子共有属性和方法 做成父类 避免重复代码 package com.lovo; /** * 类: 动物 * @author Abe * 属性: 名字 步距 总距离 睡觉的日子 */ public class Animal { protected String name; protected int step; protected int distance; protected int sleepDay; /** * 构造器 * @param name */ public Animal(

《面对对象分析与设计》书摘

太久没有读这些基础概念了.关键信息摘录备忘. 二.对象模型 面向对象编程是一种实现的方法,在这种方法中,程序被组织成许多组相互劣作的对象,每个对象代表某个类的实例,而类则属于一个通过继承关系形成的层次关系. 面对对象设计是一种设计方法,包含面对对象分解的过程和一种表示法,这种表示法用于展现被设计系统的逻辑模型和物理模型.静态模型和动态模型. 面向对象分析是一种分析方法,这种方法利用从问题域的词汇表中找到的类和对象来分析需求.  对象模型要素 抽象 封装 模块化 层次结构 类型 并发 持久 抽象

《Effective C++》 读书笔记之四 设计与申明

<Effective C++> 读书笔记之四 设计与申明 条款18:让接口容易被正确使用,不易被误用. 重点: 好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容. "阻止误用"的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等. 20

初遇面对对象

问题一:为什么要出现面对对象的语言,用来解决什么样的问题? 所有的程序设计语言都提供抽象,汇编语言是对底层机器的抽象,但仍要求程序员按计算机的结构去思考,而程序员要做的必须要能在机器模型和实际上要解决的问题的模型建立联系.(实际上是一个建模的过程)早期是对要解决的问题进行建模,这就是面对过程的,但是缺陷很快就被发现,它所编写的程序难以维护或者说维护费用昂贵.面对对象的方法为程序员提供了在问题空间中表示各种事物元素的工具.好处是:当我们描述解决方案的代码的时候,也就是在表达该问题的文字.使得程序员

effective c++条款32~40“继承与面向对象设计”整理

条款32:确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公有继承)意味is-a(是一种)的关系. 在C++领域中,任何函数如果期望获得一个类型为基类的实参(而不管是传指针或是引用),都也愿意接受一个派生类对象(而不管是传指针或是引用).(只对public继承才成立.)好的接口可以防止无效的代码通过编译,因此你应该宁可采取"在编译期拒绝"的设计,而不是"运行期才侦测"的设计.is a并不

Effective c++(笔记)之继承关系与面向对象设计

1.公有继承(public inheritance) 意味着"是一种"(isa)的关系 解析:一定要深刻理解这句话的含义,不要认为这大家都知道,本来我也这样认为,当我看完这章后,就不这样认为了. 公有继承可以这样理解,如果令class D以public 的形式继承了class B ,那么可以这样认为,每一个类型为D的对象同时也可以认为是类型为B的对象,但反过来是不成立的,对象D是更特殊化更具体的的概念,而B是更一般化的概念,每一件事情只要能够施行于基类对象身上,就一定可以应用于派生类对

Effective C++:条款32:确定你的public继承塑模出is-a关系

(一) public继承意味着"is-a"关系.它的意思是:如果B以public形式继承自A,那么B类型对象肯定是一个A对象,反之不成立.A是B的一种抽象,B是A的特例.任何使用A的地方,都能使用B. (二) public继承意味着"is a"(是一种)关系: (1)任何一个继承类对象也是一个基类对象: (2)任何可以出现基类对象的地方也可以出现一个继承类对象(例如函数的实参): (3)任何一个可以在基类对象上所做的操作,同样也可以在派生类上操作(结果可能是设计者想