#include <iostream>
using namespace std;
/*
* 纯虚函数和抽象类
* 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,
* 要求任何派生类都定义自己的版本
*
* 纯虚函数为各派生类提供一个公共API(或公共界面)(接口的封装和设计,软件的模块功能划分)
*
* 纯虚函数说明形式:
* virtual 类型 函数名(参数表) = 0;
*
* 抽象类:
* 一个具有纯虚函数的基类称为抽象类
* 抽象类无法被直接实例化,用于子类继承
*
* 通过抽象类,定义一套接口,让框架的使用者实现抽象类的接口定义
* 框架就可以在不做任何改变的情况下,调用后来人写的子类(抽象类的子类)。
*
* 抽象类可以兼容未来代码(未来新增代码)
*
*/
/*
* C++没有接口的概念,C++可以使用纯虚函数实现接口
* 接口类中只有函数原型声明,没有任何数据的定义。
*
class MyInterface {
public:
virtual void add() = 0;
virtual void remove() = 0;
virtual void modify() = 0;
virtual void find() = 0;
};
经验证明:
多重继承接口不会带来二义性和复杂性等问题。
多重继承可以通过静心设计用单继承和接口来代替。
接口类只是一个功能说明,而不是功能实现。
子类需要根据功能说明定义功能实现。
*/
// 抽象类
class Shape {
public:
virtual int showArea() = 0; // 纯虚函数
};
class Triangle : public Shape {
public:
Triangle(int w = 0, int h = 0) {
this->w = w;
this->h = h;
}
virtual int showArea() {
cout << "三角形面积" << w * h / 2 << endl;
return (w * h / 2);
}
protected:
private:
int w;
int h;
};
class Square : public Shape {
public:
Square(int w = 0, int h = 0) {
this->w = w;
this->h = h;
}
virtual int showArea() {
cout << "四边形面积" << w * h << endl;
return (w * h);
}
protected:
private:
int w;
int h;
};
/*
* 通过抽象类,定义一套接口,让框架的使用者实现抽象类的接口定义
* 框架就可以在不做任何改变的情况下,调用后来人写的子类(抽象类的子类)。
* 抽象类可以使用未来代码(未来新增代码)。
*/
void printShapeArea(Shape* pBase) {
pBase->showArea();
}
void main() {
//Shape s = Shape(); // error: “无法实例化抽象类”
Shape* s = NULL;
Triangle tri(10, 20);
//tri.showArea();
printShapeArea(&tri);
Square sq(30, 40);
//sq.showArea();
printShapeArea(&sq);
system("pause");
}
C++纯虚函数和抽象类
最新推荐文章于 2022-08-05 10:28:38 发布
本文详细介绍了C++中的纯虚函数和抽象类概念,强调它们在软件设计中的作用,如提供公共API、实现接口封装以及模块功能划分。通过示例展示了如何使用抽象类定义接口,并通过多态调用子类方法,阐述了抽象类在框架设计和兼容未来代码方面的优势。同时,讨论了C++中接口的实现方式以及多重继承的处理策略。
摘要由CSDN通过智能技术生成