• 高效C++:继承和实现


      如何正确的使用继承和实现是本章说明的重点。

    确定public继承的关系是is-a

    • public继承等同于is-a

    • 对public继承,所有base的特性,在derived上都适用

    避免遮掩继承而来的名称

    • Deried中的函数会掩盖base中的函数,不论函数是成员函数、虚函数亦或是纯虚函数(不同作用域的函数,名称相同也不构成重载)

    • 使用 using base::f 的语法在Deried中强制使用base中被掩盖的函数

    • 一定要记清楚,Deried中使用base中的同名函数就违背is-a法则

    区分接口实现和实现继承

    • non-virtual:指定接口继承和强制实现

    • virtual:指定接口继承和一个缺省实现版本

    • pure-virtual分两种情况:

      • 没有函实现:指定接口继承

      • 有函数实现:指定接口继承和一个缺省实现版本(加作用域调用)------ 和virtual相同

    考虑virtual以外的实现

    • 虚函数的功能也可以被其他设计方法替代,从而避免虚函数的坑
    • 成员函数中调用虚函数是多态,调用虚函数时可以理解为this->f(),且此时没有public、protect和private的显示,因为是类内调用

      • non-virtual-interface

      • Dase中调用virtual函数,Deried中重写virtual函数,调用实际由Base确定,实现由Deried确认

    • Function Pointer

      • 函数指针作为类的成员变量,另外提供接口调用函数指针指向的函数

    • 使用模板函数对象代替函数指针

    • 将不同功能的函数设计在两个类中,实现成两种不同的继承体系

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

    • 注意继承中的名称遮掩(遮掩是对类外调用而言,不要和权限混淆,都当成public考虑)

    绝不重新定义继承而来的缺省参数

    • 在不覆盖non-virtual函数的前提下,绝不重新定义继承而来的缺省参数只针对virtual而言

    • 函数参数的缺省值是静态绑定的,virtual是动态绑定的,所以不要重新定义参数的默认值

    • 可以使用NVI方式解决,no-virtual函数调用virtual函数,因为no-virtual函数绝对不能被掩盖,也就不会修改默认值

    通过复合建模has-a或根据某物实现

    • A类中有B类的对象,叫has-a

    • 复合比继承扩张性更好

    谨慎的使用private继承

    • private继承意味着has-a,和复合的概念相同

    • 能用复合就不用private,除非是特殊情况,Deried要继承Base中的protect成员

    • private继承可以节约内存

    明智和谨慎的使用多重继承

    • 多重继承比较复杂,且容易导致二义性

    • virtual继承会增加复杂度等成本

    • 多重继承的使用场景:实现多个接口,继承一个基类

    • 建议:不使用多继承,使用单继承和实现多接口
  • 相关阅读:
    ubuntu命令
    mac获取root权限
    centos7安装解压缩工具 ncompress
    ubuntu17.04 配置go环境变量
    vue.js 拦截器
    ubuntu 安装jdk
    ubuntu安装deb文件
    初识 阿里云 SSL 证书申请
    java之XML
    LanProxy 内网映射穿透
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11452666.html
Copyright © 2020-2023  润新知