开放封闭原则(对扩展开放(Open for extension),对修改封闭(Closed for modification))是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所带来的巨大好处,也就是可维护、可扩展、可复用、灵活性好,开发人员应该仅对程序中频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
接下来以一个计算器类来作为开闭原则案例:
#include <iostream>
using namespace std;
//开闭原则:对扩展开放,对修改关闭;增加功能时,通过增加代码实现,而不是修改源代码。
//利用面向对象编程的:继承和多态来实现开闭原则
//多态满足条件:
//1、有继承关系
//2、子类重写父类中的虚函数
//多态使用:
//父类指针或引用指向子类对象
//写一个抽象类,具有纯虚函数的类称为抽象类
class AbstractCaculator{
public:
virtual int getResult() = 0; //纯虚函数 函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
virtual void setNum(int a,int b) = 0;
};
//加法计算器
class PlusCaculator : public AbstractCaculator{ //1、有继承关系
public:
virtual void setNum(int a,int b){ //2、子类重写父类中的虚函数(重写:函数返回值类型,函数名,函数参数一致)
this->m_a = a;
this->m_b = b;
}
virtual int getResult(){
return m_a + m_b;
}
public:
int m_a;
int m_b;
};
//减法计算器
class MinusCaculator : public AbstractCaculator{
public:
virtual void setNum(int a,int b){
this->m_a = a;
this->m_b = b;
}
virtual int getResult(){
return m_a - m_b;
}
public:
int m_a;
int m_b;
};
//以上实现了加法、减法功能,若需要增加乘法功能,只需要添加实现乘法功能的代码即可,无需修改源文件,即开闭原则。
//增加乘法功能
class MultiCaculator : public AbstractCaculator{
public:
int m_a;
int m_b;
public:
virtual void setNum(int a,int b){
this->m_a = a;
this->m_b = b;
}
virtual int getResult(){
return m_a * m_b;
}
};
//测试
void test01(){
AbstractCaculator* ac = new PlusCaculator; //多态的使用:父类指针或引用指向子类对象
ac->setNum(10,20);
cout<<"加法"<<ac->getResult()<<endl;
delete ac;
ac = new MinusCaculator;
ac->setNum(100,1);
cout<<"减法"<<ac->getResult()<<endl;
delete ac;
}
void test02(){
AbstractCaculator* ac = new MultiCaculator;
ac->setNum(100,200);
cout<<"乘法"<<ac->getResult()<<endl;
delete ac;
}
int main(int argc, char** argv) {
test01();
test02();
return 0;
}
例子中所涉及的C++知识回顾:
1.封装
- 将属性和行为作为一个整体
- 将属性和行为加以权限控制
- 语法:class 类名{ 访问权限: 属性 / 行为 };
2.继承
- 有些类与类之间存在特殊的关系,我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码。
- 语法:class A : public B;A称为子类或派生类,B称为父类或基类。
3.多态
- 多态的满足条件:(1)有继承关系,(2)子类重写父类的虚函数(重写:函数的返回值,函数名,函数参数一致)。
- 多态的使用条件:父类指针或引用指向子类。
4.this指针
- 在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:这一块代码是如何区分哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象,this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可。 - this指针的用途:
- 当形参和成员变量同名时,可用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
来源:CSDN
作者:努力的自学编程
链接:https://blog.csdn.net/weixin_44809329/article/details/104553036