本篇介绍两个概念,纯虚函数和抽象类。这两个概念并不是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 纯虚函数与抽象类