1.纯虚函数
在虚函数的声明后加“=0” ,表示当前虚函数无需定义
eg:
class Shape //图形类
{
public:virtual double circum()const = 0;//周长,纯虚函数virtual double area()const = 0; //面积,纯虚函数virtual void show()const; //输出,虚函数
};
2.抽象类
抽象类为一个类族提供公共接口(父类引用、指针),便于发挥动态多态的特性。
注意:
- 抽象类只能作为基类,无法创建对象;
- 抽象类可以提供类的指针、引用,便于实现动态多态;
- 只要类中含有纯虚函数,该类则为抽象类
- 抽象类的派生类中若依然存在纯虚函数,则其派生类依然为抽象类,抽象类直至类中没有纯虚函数为止,才能创建对象。
结合代码示例:
//纯虚函数、抽象类
#include <iostream>
#include <string>
#include<math.h>
using namespace std; //需要的操作:1.构造; 2.析构; 3.周长; 4.面积; 5.输出相应的数据
//1.用普通的类结构实现上面五种图形
//2.利用继承和多态实现上面五种图形
//3.把上面两种方式进行对比class Shape //抽象类
{
public:virtual double round()const =0{}virtual double area()const =0{}virtual ~Shape(){}
};class San :public Shape //三角形
{
public:int a, b, c;San(int a1,int b1,int c1):a(a1),b(b1),c(c1){}virtual double round()const {cout << "三角形三边为" <<a<<","<<b<<","<<c<< endl;return a + b + c;}virtual double area()const {if (a + b > c || a + c > b || c + b > a){double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c)); }}
};
class Chang :public Shape //长方形
{
public:int a, b;Chang(int a1,int a2):a(a1),b(a2){}virtual double round()const{cout << "长方形的两条边为:" << a << "," << b << endl;return 2 * (a + b);}virtual double area()const {return a * b;}
};
class Zheng :public Shape //正方形
{
public:int len;Zheng(int l) :len(l) {}virtual double round()const {cout << "正方形的边长为:" << len << endl;return 4 * len;}virtual double area()const {return len * len;}
};
class Circle :public Shape //圆形
{
public:int r;Circle(int r1):r(r1){}virtual double round()const {cout << "圆形的半径为:" << r << endl;return 3.14 * 2 * r;}virtual double area()const{return 3.14 * r * r;}
};
class Ping :public Shape //平行四边形
{
public:int a;//底边(长边)int b;//高int c;//短边Ping(int a1,int b1,int c1):a(a1),b(b1),c(c1){}virtual double round()const {cout << "平行四边形的长边、短边、高为:" << a << "," << c << "," << b << endl;return 2 * (a + c);}virtual double area()const {return a * b;}
};void show(Shape& a)
{cout<<" 周长为:" << a.round() << endl;;cout << " 面积为:" << a.area() << endl;;
}int main()
{San s1(3, 4, 5);show(s1);Chang s2(4, 5);show(s2);Ping s3(5, 3, 4);show(s3);Zheng s4(5);show(s4);Circle s5(10);show(s5);return 0;
}
代码由抽象类Shape作为基类,派生出各个图形类,由虚函数的继承特性使得所有派生类的周长、面积计算函数均属于虚函数,最后调用类外show() 函数以抽象类 Shape 作为对象接口,实现同太多太输出不同对象的参数,相比无继承、无虚函数、无动态多态的代码设计而言,提高了代码的复用率,减少了冗余的代码,使程序简单便捷。