zoukankan      html  css  js  c++  java
  • 条款34:区分接口继承和实现继承

    在设计类的继承时,一般有三种想法:

    1 只继承函数接口

    2 继承函数接口及其实现,并且允许修改该实现

    3 继承函数接口及其实现,但是不允许修改该实现

     

    考虑如下例子: 

     1 #include <iostream>
     2 
     3 class Shape
     4 {
     5 public:
     6     virtual void draw() = 0;                       // 只提供接口
     7     virtual void error(const std::string& msg);    // 提供接口的同时提供一份默认的实现,派生类可以修改为自己的实现版本
     8     int objectID() const;                          // 提供接口的同时提供一份强制性的实现,派生类一般不应该修改该实现
     9 };
    10 void Shape::error(const std::string& msg)   // 接口的默认实现
    11 {
    12 
    13 }
    14 int Shape::objectID() const                 // 接口的强制实现
    15 {
    16     return 0;
    17 }
    18 
    19 class Rectangle : public Shape
    20 {
    21     virtual void draw();
    22 };
    23 void Rectangle::draw(){}
    24 
    25 int main()
    26 {
    27     int id;
    28     Shape* ps1 = new Rectangle;
    29     ps1->draw();                             // 调用Rectangle::draw
    30     ps1->error("Shape::error");              // 调用Shape::error
    31     id = ps1->objectID();                    // 调用Shape::objectID
    32 
    33     return 0;
    34 }

    总结:

    • 声明一个纯虚函数的目的是为了让派生类只继承函数接口,不必提供实现
    • 声明虚函数的目的是提供接口的同时提供一份默认的实现,派生类可以修改为自己的实现版本
    • 声明非虚函数的目的是提供接口的同时提供一份强制性的实现,派生类一般不应该修改该实现(就像上例中的objectID函数,其函数体总是由相同计算方式得到的,因此不必在派生类中修改)
  • 相关阅读:
    <二>基于Django 简单后台管理页面
    单页面中使用vue和iview、echarts,引用组件
    vuecli更新
    vuex promise async await
    vue父子组件之间传值
    常用正则
    vue项目利用loadsh实现防抖和节流
    vue项目实现按钮的权限
    使用内存虚拟硬盘 提高ArcGIS server并发性能的一种方法
    esri联邦用户大会 总结
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4525475.html
Copyright © 2011-2022 走看看