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 作为对象接口,实现同太多太输出不同对象的参数,相比无继承、无虚函数、无动态多态的代码设计而言,提高了代码的复用率,减少了冗余的代码,使程序简单便捷。