C++ 纯虚函数(抽象类)

什么是纯虚函数?

含有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被实现,那么,它的派生类还是个抽象类。

含有存虚函数的类也就是抽象类!


为什么要使用纯虚函数?

当一个类要用做基类时,且其派生出的子类都有一个共性的成员函数,其中每个子类的函数用法都不一样;那么,就可以把该类定义为纯虚函数,也就是抽象类。定义为纯虚函数后,该类不可以再创建对象!

例如:
以一个形状类作为基类,其因为是基类,所以派生出的子类圆,长方形,正方形等会有共性的成员函数,假如该共性的成员函数基类中不实现,那么,就可以把它定义为纯虚函数,则该类就会变成抽象类。

在这里插入图片描述

纯虚函数如何定义?

把虚函数定义好不做任何具体实现

用法:纯虚函数,使用virtual和 =0

// 声明为纯虚函数
virtual float acreage() = 0;

什么时候使用纯虚函数?

1.某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象)。
2.这个类中定义的某些成员函数,只是为了提供一个形式上的接口,准备让子类来做具体的实现。
3.此时,这个方法,就可以定义为“纯虚函数”, 包含纯虚函数的类,就称为抽象类。


定义纯虚函数的具体实现

代码:

#include <iostream>
#include <string>

using namespace std;


class Shape {
public:
	Shape(string colour = "白") { this->colour = colour; }

	// 声明为纯虚函数
	virtual float acreage() = 0;
private:
	string colour;	// 颜色
};

// 因为没有实现acreage()函数,因此,该类依旧是抽象类
class Circle : public Shape {
public:
	Circle(float radius=0.0, string colour="白") : Shape(colour) {
		this->r = radius;
	}

private:
	float r;	// 半径
};

int main(void) {
	Shape s;		// 错误,抽象类不能创建对象
	Circle c;		// 错误,抽象类不能创建对象

	return 0;
}

由上面可以直到,在Circle类中,因为没有实现从抽象类中继承下来的acreage()纯虚函数,因此,Circle类也是抽象类。

那要如何修改呢?

只需要自己实现该纯虚函数后,Circle类就不会变成抽象类了。

// 实现从基类继承下来的纯虚函数
virtual float acreage() { return r * r * 3.14; }
#include <iostream>
#include <string>

using namespace std;


class Shape {
public:
	Shape(string colour = "白") { this->colour = colour; }

	// 声明为纯虚函数
	virtual float acreage() = 0;
private:
	string colour;	// 颜色
};

class Circle : public Shape {
public:
	Circle(float radius=0.0, string colour="白") : Shape(colour) {
		this->r = radius;
	}

	// 实现从基类继承下来的纯虚函数
	virtual float acreage() { return r * r * 3.14; }

private:
	float r;	// 半径
};

int main(void) {
	Shape s;		// 错误,抽象类不能创建对象
	Circle c;		// 可以创建对象

	return 0;
}

纯虚函数的注意事项:

父类声明某纯虚函数后,
那么它的子类,
1)要么实现这个纯虚函数 (最常见)
2)要么继续把这个纯虚函数声明为纯虚函数,这个子类也成为抽象类
3)要么不对这个纯虚函数做任何处理,等效于上一种情况(该方式不推荐)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值