C++:纯虚函数及抽象类

发布于:2024-03-03 ⋅ 阅读:(63) ⋅ 点赞:(0)

1.纯虚函数

在虚函数的声明后加“=0” ,表示当前虚函数无需定义

eg:

class Shape //图形类
{
public:
    virtual double circum()const = 0;//周长,纯虚函数
    virtual double area()const = 0;  //面积,纯虚函数
    virtual void show()const;        //输出,虚函数
};

2.抽象类

抽象类为一个类族提供公共接口(父类引用、指针),便于发挥动态多态的特性。

注意:

  1. 抽象类只能作为基类无法创建对象
  2. 抽象类可以提供类的指针、引用,便于实现动态多态
  3. 只要类中含有纯虚函数,该类则为抽象类
  4. 抽象类的派生类中若依然存在纯虚函数,则其派生类依然为抽象类,抽象类直至类中没有纯虚函数为止,才能创建对象。

结合代码示例:


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


网站公告

今日签到

点亮在社区的每一天
去签到