-
-
[分享]C++基础十四-抽象类
-
发表于: 2021-9-30 14:20 8674
-
在C++ 中,可以将虚函数声明为纯虚函数,在虚函数声明的结尾加上 =0 ,表明此函数为纯虚函数,语法格式为:
最后的 =0 并不表示函数返回值为0,它只起形式上的作用,告诉编译器这是一个纯虚函数。纯虚函数没有函数体,只有函数声明。
包含纯虚函数的类称为抽象类(Abstract Class),抽象类通常作为基类,让派生类去实现纯虚函数,同时派生类必须实现纯虚函数才能被实例化,否则还是一个抽象类。
上述代码体现了最经典的多态场景,给飞行员不同的飞机,就能表现出不同的结果。虚函数和纯虚函数都能做到这一点,区别是,子类如果不提供虚函数的实现,就会自动调用基类的缺省方案,而子类如果不提供纯虚函数的实现,则编译将会失败。基类提供的纯虚函数实现版本,无法通过指向子类对象的基类类型指针或引用来调用,因此不能作为子类相应虚函数的备选方案。
当基类的某个成员方法,在大多数情形下都应该由子类提供个性化实现,但基类也可以提供一个备选方案的时候,应该将其设计为虚函数。例如航空器的加油行为,每种不同的航空器原则上都应该有自己的个性化燃油加充方式,但也可以有一种通用的燃油加充方式。
当基类的某个成员方法,必须由子类提供个性化实现的时候,应该将其设计为纯虚函数。例如航空器的飞行动作,逻辑上每种航空器都必须提供为其设计的个性化飞行方式,并没有一种通用的飞行方式。
基类提供的纯虚函数的实现版本,并非为了多态性考虑,因为指向子类对象的基类指针和引用无法调用该版本。纯虚函数在基类中的实现跟多态性无关,它只是提供了一种语法上的便利,在变化多端的应用场景中留有后路。
使用一个基类类型的指针或者引用,来指向子类对象,进而调用经由子类复写的个性化的虚函数,这是C++实现多态性的一个最经典的场景。
1、在类成员方法的声明语句前加上关键字virtual,成为虚函数。
2、在虚函数的声明语句末加上 =0 ,成为纯虚函数。
3、子类可以重新定义基类的虚函数,这个行为称为复写(override)。
4、不管是虚函数还是纯虚函数,基类都可以为他们提供实现(implementation)。
5、子类可自主选择是否要提供一份属于自己的个性化虚函数实现。
6、子类必须提供一份属于自己的个性化纯虚函数实现。
virtual 返回值类型 函数名 (函数参数)
=
0
;
virtual 返回值类型 函数名 (函数参数)
=
0
;
#pragma once
#include <iostream>
using namespace std;
class
CAircraft
{
public:
CAircraft();
~CAircraft();
virtual void Refuel();
/
/
加燃油,虚函数
virtual void FlyMode()
=
0
;
/
/
飞行方式,纯虚函数
};
class
CHelicopter :public CAircraft
{
public:
CHelicopter();
~CHelicopter();
void FlyMode();
};
class
CFighter :public CAircraft
{
public:
CFighter();
~CFighter();
void Refuel();
void FlyMode();
};
#pragma once
#include <iostream>
using namespace std;
class
CAircraft
{
public:
CAircraft();
~CAircraft();
virtual void Refuel();
/
/
加燃油,虚函数
virtual void FlyMode()
=
0
;
/
/
飞行方式,纯虚函数
};
class
CHelicopter :public CAircraft
{
public:
CHelicopter();
~CHelicopter();
void FlyMode();
};
class
CFighter :public CAircraft
{
public:
CFighter();
~CFighter();
void Refuel();
void FlyMode();
};
#include "Aircraft.h"
CAircraft::CAircraft()
{
}
CAircraft::~CAircraft()
{
}
void CAircraft::Refuel()
{
cout <<
"通用燃油"
<< endl;
}
void FlyMode()
{
cout <<
"停止起飞"
<< endl;
}
CHelicopter::CHelicopter()
{
}
CHelicopter::~CHelicopter()
{
}
void CHelicopter::FlyMode()
{
cout <<
"山地打击"
<< endl;
}
CFighter::CFighter()
{
}
CFighter::~CFighter()
{
}
void CFighter::Refuel()
{
cout <<
"航空煤油"
<< endl;
}
void CFighter::FlyMode()
{
cout <<
"高空巡航"
<< endl;
}
#include "Aircraft.h"
CAircraft::CAircraft()
{
}
CAircraft::~CAircraft()
{
}
void CAircraft::Refuel()
{
cout <<
"通用燃油"
<< endl;
}
void FlyMode()
{
cout <<
"停止起飞"
<< endl;
}
CHelicopter::CHelicopter()
{
}
CHelicopter::~CHelicopter()
{
}
void CHelicopter::FlyMode()
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [分享]C++基础十七-异常机制 8576
- [分享]C++基础十六-模板 8939
- [分享]C++基础十五-运算符重载 8962
- [分享]C++基础十四-抽象类 8675
- [分享]C++基础十三-多态 8475