抽象基类(ABC)
前言
我对抽象基类(Abstract Base Class,ABC)的理解在两个点上。第一点是抽象,即高度抽象;第二点是基类,对抽象基类来说,它的存在只是为了作为基类(区别于具体类),不可以被实例化。
高度抽象一词听起来本身就很“抽象”,不妨让我用“总结”这个词进行通俗解释。比方这里有两类人,一类只是聋人,另一类只是盲人。现在我们需要对这两类人抽象,也就是需要总结两类人的相同点+不同点,然后付诸于代码。为方便起见,这里就列举三个行为:散步为相同点,看得见与看不见为不同点,听得见与听不见为不同点——这样一个过程,就是在“抽象”。(好吧,这般解释可能还是抽象)
如何实现ABC
在C++中,virtual
关键字使得函数有虚函数与非虚函数之分,显然,virtual的存在让一个函数成为虚函数。而虚函数中,又分纯虚函数和非纯虚函数:
virtual void hear() = 0; // 纯虚函数
virtual void walk(); // 非纯虚函数(常规虚函数)
在一个类中,如果至少有一个纯虚函数,那么认为这个类是抽象基类。
class DeafPerson {
public:
// ...
virtual void walk() = 0;
// ...
};
// ...
如此一来,DeafPerson就是一个抽象基类了。
为什么需要ABC
我们都知道,无论盲人还是聋人,他们都是人,他们都可以散步,但是不一定有视觉或听觉的能力。我们当然可以做以下设计:
class DeafPerson {
public:
string name; // 名字
void walk() {
cout << "is able to walk" << endl; }
void hear() {
cout << "is not able to hear" << endl; }
void see() {
cout << "is able to see" << endl; }
};
class BlindPerson {
public:
string name;
void walk() {
cout << "is able to walk" << endl; }
void hear() {
cout <<</