• Effective C++ 条款34 区分接口继承和实现继承


    1. C++对于函数成员的继承主要有三种:

        只继承接口,不继承实现;

        同时继承接口和实现,同时允许覆写实现;

        继承接口和实现,同时不允许对实现进行覆写.

    2. 对于public继承,成员函数的接口应该总是被继承(由于is-a关系的存在),其中:

        pure-virtual函数的目的只是为了使派生类继承函数接口;

        impure-virtual(虚但非纯虚)函数的目的是既允许派生类继承接口和实现,又可以重写实现.

        non-virtual函数的目的是令派生类继承函数的接口以及一份强制实现.(如果想要重写,那么之前就应该设为virtual函数)

        public继承中,基类成员函数的种类应该遵循以上原则定义.

    3. virtual函数既允许继承实现又允许重写实现的目的有时候会带来危险性,例如:

    class Base{
    public:
        virtual fun(){...}
        ...
    private:
        ...
    }
    class Derived:public Base{
    public
        ...
    private:
        ...
    }
    View Code

    Derived忘记定义自己的fun函数,因此默认继承Base的fun函数,这有可能是程序员不想要的结果,为了防止以下结果,可以将fun函数设为protect函数并命名为defaultFun以指明它是缺省实现,要使用缺省实现,就在fun中显示调用defaultFun函数,如下:

    class  Base{
    public:
        virtual void fun()=0;
        ...
    protect:
        void defaultFun(){...}
        ...
    private:
       ...
    }
    Derived:public Base{
    public:
        virtual void fun{
            defaultFun();
        }
    ...
    private:
        ...
    } 
       
    View Code

    由于fun函数在Base中被设为pure-virtual,因此Derived必须提供自己的定义,而它可以主动使用Base提供的defaultFun函数作.这样既通过pure-virtual的fun函数实现了只继承接口的功能,又通过non-virtual的defaultFun函数提供了一份使用default版本的选择.(defaultFun设为protect的目的是提高尽可能高的封装性)

    除了使用以上将接口与实现分离的方法,还可以采用为Base的pure-virtual函数fun提供定义的方式,即:

    class Base{
    public:
        virtual void fun()=0;
        ...
    private:
        ...
    }
    void Base::fun(){
        ...
    }
    View Code

    Derived必须对fun函数进行实现,但如果想使用default实现,可以如以下定义:

    class Derived:public Base{
    public:
        virtual void fun(){
            Base::fun();
        }
        ...
    private:
        ...
    }
    View Code
  • 相关阅读:
    Linux 内核中的 Device Mapper 机制
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Docker容器 暴露多个端口
    修改docker容器的端口映射
    Ubuntu Docker安装
    Docker容器技术的PaaS云平台架构设计***
    scala 学习笔记三 闭包
    scala 学习笔记二 方法与函数
    scala 学习笔记一 列表List
    Python3 写Windows Service服务程序
  • 原文地址:https://www.cnblogs.com/reasno/p/4796086.html
Copyright © 2020-2023  润新知