当前位置: 首页 > article >正文

C++设计模式-里氏替换原则

里氏替换原则定义了继承规范。(封装、继承、多态)

定义1:类型S对象o1,类型T对象o2,o1换成o2时程序意图不变,那么S是T的子类。

定义2:使用子类不破坏父类的意图。

注意:如果子类不能完成父类意图,则不使用继承,采用依赖、聚合、组合等。

e.g.1 不符合里氏替换原则

#include <iostream>
using namespace std;
class Map {
};
class HashMap :public Map {
};
class Father {
public:
	virtual void DoSth(HashMap& map) {
		cout << "father dosth" << endl;
    }
};
class Sun :public Father {
public:
    void DoSth(Map& map) {//加override:error C3668: “Sun::DoSth”: 包含重写说明符“override”的方法没有重写任何基类方法
        cout << "sun dosth" << endl;
    }
};
int main(){
    Father* f = new Father;
    HashMap* map = new HashMap;
    f->DoSth(*map);//father dosth
    //根据里氏替换原则
    Sun* s = new Sun;
    s->DoSth(*map);//sun dosth//这时子类没有重写父类函数,歪曲了父类的意图
    //里氏替换原则,所有引用基类的地方必须能透明的使用其子类对象。
    //说明:要想子类替换父类,则子类的函数必须扩大于父类参数。
}

e.g.2不符合里氏替换原则

#include <iostream>
using namespace std;
class Map {
};
class HashMap :public Map {
};
class Father {
public:
	virtual void DoSth(Map& map) {
		cout << "father dosth" << endl;
	}
};
class Sun :public Father {
public:
	void DoSth(HashMap& map) {//加override:error C3668: “Sun::DoSth”: 包含重写说明符“override”的方法没有重写任何基类方法
		cout << "sun dosth" << endl;
	}
};
int main() {
	Father* f = new Father;
	HashMap* map = new HashMap;
	f->DoSth(*map);//father dosth
	//根据里氏替换原则
	Sun* s = new Sun;
	s->DoSth(*map);//sun dosth//这时子类没有重写父类函数,歪曲了父类的意图
	//里氏替换原则,所有引用基类的地方必须能透明的使用其子类对象。
	//说明:这里子类对父类的参数进行收窄。
}


http://www.kler.cn/a/228308.html

相关文章:

  • 基于Springboot + vue实现的美发门店管理系统
  • Spring 是如何解决循环依赖问题
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)
  • SpringBoot项目中的异常处理
  • 【时时三省】(C语言基础)文件的顺序读写
  • GDB相比IDE有什么优点
  • ReactNative实现宽度变化实现的动画效果
  • Qt基础-QMap详解
  • 随机森林超参数的网格优化(机器学习的精华--调参)
  • Linux定时器和时间管理
  • arcpy高德爬取路况信息数据json转shp
  • 关于如何将Excel转成Word,可能有一些你想知道的技巧
  • Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化
  • STM32单片机的基本原理与应用(六)
  • 阿里巴巴 Java 开发手册
  • Leetcode 3031. Minimum Time to Revert Word to Initial State II
  • DBA的节前紧急任务:一份全面的数据库自救指南
  • kubeadm部署k8s集群
  • Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin
  • 【教程】微服务使用Feign接口进行远程调用的步骤
  • 【分布式】雪花算法学习笔记
  • 从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能
  • react和antd学习笔记
  • STM32--揭秘中断(简易土货版)
  • Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)
  • k8s学习-数据管理