C++纯虚函数和抽象类
在 C++ 中,将虚函数声明为纯虚函数的语法格式为:
例如:
比如实例上 AbstractBase 类:
下面的示例演示了如何使用纯虚函数和抽象类。
Circle 和 Square 类分别继承了 Shape 类并实现了 draw() 函数。main() 函数中创建了 Circle 和 Square 类的实例,并使用一个指针数组来调用它们的 draw() 函数。
运行结果为:
纯虚函数首先是虚函数,可以实现多态,如果某个虚函数不需要在基类中实现,或者实现也没有实际意义,可以考虑声明为纯虚函数,例如本文示例 Shape 类中的 draw() 函数。
virtual 返回值类型 函数名 (函数参数) = 0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上
=0
,表明此函数为纯虚函数。例如:
class AbstractBase { public: virtual void pureVirtualFunction() = 0; // 纯虚函数声明 };包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。如果强行实例化抽象类,则会导致编译出错。
比如实例上 AbstractBase 类:
AbstractBase obj; //错误,AbstractBase 类中有纯虚函数,是抽象列,不能实例化
抽象类的实际应用
拥有纯虚函数的抽象类不能实例化,要实例化必须首先从抽象类派生出一个具体类,然后实例化该具体类。下面的示例演示了如何使用纯虚函数和抽象类。
#include <iostream> class Shape { public: virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void draw() { std::cout << "Drawing a circle." << std::endl; } }; class Square : public Shape { public: void draw() { std::cout << "Drawing a square." << std::endl; } }; int main() { Circle circle; Square square; Shape* shapes[] = {&circle, &square}; for (const auto shape : shapes) { shape->draw(); } return 0; }示例中 Shape 是一个抽象类,到底要画成什么样子在 Shape 类中不能确定,因此不能给出 draw() 函数的具体实现,于是 draw() 函数声明为纯虚函数。
Circle 和 Square 类分别继承了 Shape 类并实现了 draw() 函数。main() 函数中创建了 Circle 和 Square 类的实例,并使用一个指针数组来调用它们的 draw() 函数。
运行结果为:
Drawing a circle.
Drawing a square.
总结
纯虚函数指的是没有定义(实现)的虚函数,拥有纯虚函数的类称为抽象类。纯虚函数首先是虚函数,可以实现多态,如果某个虚函数不需要在基类中实现,或者实现也没有实际意义,可以考虑声明为纯虚函数,例如本文示例 Shape 类中的 draw() 函数。