在C++ 中,虚函数可以很好的实现多态,然而也有一定的局限,这个局限在于,虚函数必须在基类中定义,哪怕是空的实现。
例如下面这段代码编译时就会出错:
class Base { virtual void print(); }; class Derived:Base { void print() { cout << "Derived" <<endl; } };
因为Base类中的虚函数print()没有定义。
而在实际编程时我们往往会遇到无法给基类的函数定义的情况,例如,我们以图形作为基类,圆形,长方形,正方形等都是其派生类,并且设计一个成员函数来求图形面积。
double GetArea();
那么在基类图形没有被继承的时候,我们无法给出 " 图形" 的面积定义,这时我们可以将求面积的函数定义为纯虚函数,这样,它在基类中就只需要声明而不需要定义。
定义纯虚函数的方法是在 函数的后面加上 =0 。
例如如下代码实现图形的基类:
class Graph { public: virtual double GetArea() const = 0; // 定义纯虚函数 }; class Circle:Graph { public: Circle():radius(0){} Circle(double _radius):radius(_radius){} double GetArea() //派生类中实现纯虚函数 { return 3.14 * radius * radius; } private: double radius; }; class Rectangle:Graph { public: Rectangle():width(0),height(0){} Rectangle(double _width, double _height):width(_width),height(_height){} double GetArea() { return width * height; } private: double width,height; };
如果一个类含有纯虚函数,那么这个类就成为抽象基类,抽象基类无法创建具体的对象,所以你无法定义一个 ”图形“ 的对象。你只能定义出它的派生类,圆形,长方形,正方形等。
而还有一点要注意的就是,如果某个类继承自一个抽象基类但是没有将抽象基类中的所有纯虚函数都定义了,那么这个类仍然是一个抽象基类。
例如:
class ABC { virtual void fun1() = 0; virtual void fun2() = 0; //定义了两个纯虚函数 } class Derived : ABC { void fun1() { cout << "fun1" <<endl; // 只实现了一个纯虚函数 } }; int main() { Derived d1; // 编译报错,无法用抽象基类实例化对象 return 0; }
纯虚函数算是对虚函数的一个补充,我们可以利用它来方便的帮助我们实现需求。
时间: 2024-10-20 14:09:12