C++57个入门知识点_48 接口类+纯虚函数与抽象类(接口类:父类只是为了子类提供接口,规范子类对外使用的接口;包含纯虚函数的类成为抽象类;接口类可以是抽象类也可以不是;纯虚析构一定要有实现)

本篇介绍两个概念,纯虚函数和抽象类。这两个概念并不是C++所独有的语法,而是面向对象的语言都会有的。在C++中抽象类的概念比较重要,需要大家进行理解。

总结:

1. 接口类:父类只是为了子类提供接口,将具有这种性质的类称为接口类;

2. 纯虚函数和抽象类:

  • 在虚函数后边加上=0 virtual void Run()=0;,表示该函数不需要实现代码,也代表该类不需实例化
  • 纯虚函数如果没有实现,那么包含该纯虚函数的类是 抽象类,抽象类不能实例化

3. C++中对接口类和抽象类并没有严格的区分,主要是概念上的区分。

  • 接口类:只是规范该类作为父类,规范子类对外使用的接口(某些函数,可以是虚函数,不一定包含虚函数),可以是抽象类或者不是抽象类
  • 抽象类:一定要包含某一个纯虚函数,并且没有被实现

4. 纯虚析构:在C++中父类中是纯虚析构,一定要有实现,实现方法为virtual ~CAnimal() = 0 {};

1. 接口类


父类只是为了子类提供接口,将具有这种性质的类称为接口类

有以下代码:

#include <iostream>

class CAnimal
{
public:
	CAnimal(int) {
	}

	virtual ~CAnimal() {};
	virtual void Run() {};

};

class CFish :public CAnimal
{
public:
	CFish() :CAnimal(1) {

	}
	virtual ~CFish() {

	}
	virtual void Run() {
		printf("CFish::Run()\r\n");
	}

};

int main(int argc, char* argv[])
{
	//创建动物对象
	CAnimal am(1);

	//创建一条鱼对象
	CFish fish;

	return 0;
}

现实生活中我们不会像上边定义一个动物对象,动物是对所有生物的抽象概况,并不是实实在在的存在

//创建动物对象
CAnimal am(1);

再进行举例:父类是一个东西,实际生活中没有一个具体的对象被称为东西。

class 东西
class 桌子:东西

以上的动物和东西都是一个概括性的描述,在语言中也是面临同样的情况,需要创建一个真实的子类对象,但是其父类并不需要创建真实的对象,但还是需要一个父类作为一个指针和接口。父类只是为了子类提供接口,将具有这种性质的类称为接口类

当你某天成为一个架构师,就不需要每天搬砖,你会对你的软件进行顶层设计,顶层设计体现在何处呢?
类的具体代码是不会写的,但是需要对软件进行合理的规划,这时候你需要写接口类,接口类里的函数是不需要写实际代码的,只需要规范接口类中需要哪些函数,函数的功能是什么,按照你接口类的规范,去实现子类

2. 纯虚函数和抽象类


通用的代码为: CAnimal* pAm = new CFish; new CFish是由子类具体实现,作为顶层设计只是想让 CFish的抽象方法得到实现,在父类中写的是空函数。甚至父类中空函数都不想让其创建,并且不让创建父类的对象,此时引入了 纯虚函数

纯虚函数和抽象类:

  • 在虚函数后边加上=0,表示该函数不需要实现代码,也代表该类不需实例化
  • 纯虚函数如果没有实现,那么包含该纯虚函数的类是 抽象类,抽象类不能实例化
#include <iostream>

class CAnimal
{
public:
	CAnimal(int) {

	}

	virtual ~CAnimal() {};

	virtual void Run()=0;//纯虚函数,不需要实现

};

class CFish :public CAnimal
{
public:
	CFish() :CAnimal(1) {

	}
	virtual ~CFish() {

	}
	virtual void Run() {
		printf("CFish::Run()\r\n");
	}

};

int main(int argc, char* argv[])
{
	//创建动物对象
	CAnimal am(1);

	//创建一条鱼对象
	CFish fish;

	return 0;
}

编译结果:CAnimal中包含纯虚函数,无法实例化对象
在这里插入图片描述

当抽象类的纯虚函数在子类中仍然没有写实现,此时子类仍然是一个抽象类。

#include <iostream>

class CAnimal
{
public:
	CAnimal(int) {
	}

	virtual ~CAnimal() {};

	virtual void Run()=0;//纯虚函数,不需要实现

};

class CFish :public CAnimal
{
public:
	CFish() :CAnimal(1) {

	}
	virtual ~CFish() {

	}
};


int main(int argc, char* argv[])
{
	//创建一条鱼对象
	CFish fish;

	return 0;
}

编译结果:子类仍然为抽象类
在这里插入图片描述

3. 接口类与抽象类的区别

C++中对接口类和抽象类并没有严格的区分,主要是概念上的区分。

  • 接口类:只是规范该类作为父类,规范子类对外使用的接口(某些函数,可以是虚函数,不一定包含虚函数),可以是抽象类或者不是抽象类
  • 抽象类:一定要包含某一个纯虚函数,并且没有被实现

写代码时一般就将接口类写为抽象类

4. 纯虚析构


在C++中父类中是 纯虚析构,一定要有实现,实现方法为 virtual ~CAnimal() = 0 {};

#include <iostream>

class CAnimal
{
public:
	CAnimal(int) {

	}

	//纯虚析构
	virtual ~CAnimal() = 0 {};

	virtual void Run()=0;//纯虚函数,不需要实现

};

class CFish :public CAnimal
{
public:
	CFish() :CAnimal(1) {

	}
	virtual ~CFish() {

	}
	virtual void Run() {
		printf("CFish::Run()\r\n");
	}

};

int main(int argc, char* argv[])
{
	//创建一条鱼对象
	CFish fish;

	return 0;
}

5.学习视频地址:C++57个入门知识点_48 纯虚函数与抽象类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月旧城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值