回顾概念
-
所有函数(虚函数、静态成员函数、普通成员函数)的內存在代码区(编译时就确定好了),运行全是在栈区
-
成员函数中含有纯虚函数函数的类叫抽象类,抽象类是不能够创建对象的,但可以创建指针和引用
(即用派生类指针给基类指针赋值,或者基类引用派生类对象)
//A为抽象类,B是A的派生类,B中已经重写了纯虚函数 B b; //指针 A *a = &b; //或者 A *a = new B; //引用 A &a = b; //或者 A &p = *(new B);
-
抽象类的派生类没有重写纯虚函数(实现该函数的函数体),子类还是抽象类,也不可以创建对象。
纯虚函数定义
虚函数没有函数体就是纯虚函数,可以将虚函数声明为纯虚函数
virtual 返回值类型 函数名(形参表)=0;
最后的=0
并不表示函数返回值为0,它只起形式上的作用,告诉编译系统,该函数无函数体,即这是纯虚函数。
包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。
抽象类为什么不可以实例化?
如果你想要定义一个类对象,那么这个类必须是一个具体的类,也就是说,它必须实现了所有的成员函数,包括虚函数。只有这样,才能在程序中创建该类的对象。
原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。
抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。
关于纯虚函数的几点说明
-
一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。
-
只有类中的虚函数才能被声明为纯虚函数,普通成员函数和全局函数均不能声明为纯虚函数。
普通成员函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数;虚函数为了重载和多态的需要,在基类中定义的,即便定义为空;纯虚函数是在基类中声明的虚函数,它可以在基类中有定义,且派生类必须定义自己的实现方法。