-
虚函数
- 定义一个函数为虚函数,不代表函数为不被实现的函数。
- 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
-
纯虚函数
- 定义一个函数为纯虚函数,才代表函数没有被实现。
- 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的必须实现这个函数。
-
示例
class Animal { public: virtual void eat() { cout<<"animals."<<endl; } }; class Dog:public Animal { public: void eat() { cout<<"dog."<<endl; } }; int main(void) { Animal *a = new Dog(); a->eat(); // 在这里,a虽然是指向Animal的指针,但是被调函数`eat()`却是`Dog`的! 。 return 0; }
它虚就虚在“推迟联编”或者“动态联编”上,函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。虚函数只能借助于指针或者引用来达到多态的效果。
-
纯虚函数定义
-
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。将函数定义为纯虚函数的方式如下(后面多了个 =0):
virtual ReturnType Function() = 0;
-
-
只要在基类中定义了纯虚函数,则编译器要求在其派生类中必须予以重写以实现多态性。含有纯虚函数的类称为抽象类,抽象类它不能生成对象。
-
抽象类的介绍
- 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。
- 抽象类的定义: 称带有纯虚函数的类为抽象类。
- 抽象类的作用:抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。
- 使用抽象类时注意:
- 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
- 抽象类是不能定义对象的。