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

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

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

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

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

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

cpp 复制代码
#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不符合里氏替换原则

cpp 复制代码
#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//这时子类没有重写父类函数,歪曲了父类的意图
	//里氏替换原则,所有引用基类的地方必须能透明的使用其子类对象。
	//说明:这里子类对父类的参数进行收窄。
}
相关推荐
重启的码农9 分钟前
深入fecal实现 (6) 伽罗瓦域 GF(256) 运算
c++·网络协议
重启的码农12 分钟前
深入fecal实现 (2) 编码器 (Encoder)
c++·网络协议
逝雪Yuki19 分钟前
Leetcode——11. 盛最多水的容器
c++·算法·leetcode·双指针
IT小白架构师之路29 分钟前
常用设计模式系列(十五)—解释器模式
设计模式·解释器模式
蝸牛ちゃん34 分钟前
设计模式(二十三)行为型:模板方法模式详解
设计模式·系统架构·软考高级·模板方法模式
小徐不徐说36 分钟前
深入理解 Qt 信号与槽机制的底层逻辑
数据库·c++·qt·面试
蝸牛ちゃん38 分钟前
设计模式(十七)行为型:迭代器模式详解
设计模式·系统架构·迭代器模式·软考高级
大梦谁先行43 分钟前
Qt写游戏脚本/辅助(仅供参考)
c++·qt·游戏
阳光_你好1 小时前
C++中析构函数为什么需要是虚函数
c++
蝸牛ちゃん1 小时前
设计模式(十五)行为型:命令模式详解
设计模式·系统架构·软考高级·命令模式