C++的纯虚函数作为多态很重要的一环,充当了给子类接口的功能。但是这个接口一定要在子类实现才能通过编译。
但是为什么一定要在子类实现呢????
首先我们要明确一个概念,就是函数申请时我们在函数体里什么都没有写
void func () {}
这样的函数我们称其为空函数,但是函数体里也是有内容的,内容是空,相当于集合里的空集。所以只要有内容存在就没有问题的可以为函数申请内存。
但是我们再来看虚函数
virtual void func () = 0;
我们直接让虚函数函数等于0,没有函数体的存在,现在就不是空集不空集的问题,而是有没有函数体的问题,也就是说根本没有一个函数体来充当内存的角色,没有内存函数凭什么存在代码区,虽然在类中成员函数并不算类的内存空间,但是其实这些存在代码区的成员函数也是占有一部分内存空间的,具体这个函数的内存大小多大还是要看编译器是怎么计算的。
所以综上我们知道,一个函数如果想存在一定要有一个函数体。作为类中的函数,他们在类还没有被实例化的时候就已经被实例化并放在代码区里,那么作为虚函数在类中是以虚函数表的形式存在,作为父类的纯虚函数没有函数体,但是虚函数表里的函数可一定要有函数体来实现内存,这是就用到了面向对象(object oriented)非常重要的一个概念——继承,同时这也是虚函数的功能所在——为了给子类提供接口。
因此基类的纯虚函数没有函数体的这个缺陷就需要靠子类来弥补,让子类的实现纯虚函数,这样在类的虚函数表中,就会将基类的纯虚函数覆盖掉成为子类的这个已经实现了的新虚函数。
总而言之吧,纯虚函数一定要在子类实现,包含纯虚函数的类绝对不可以被实例化,同时他的子类如果没有实现这个纯虚函数也不可以被实例化!
class A {
public:
virtual void func () = 0;
};
class B : public A {
};
class C : public B {
void func () {
}
};
int main ()
{
//A a;
//B b;
C c;
return 0;
}