虚函数和纯虚函数是C++的重要特征之一,对于虚函数,在类的vtable里面有一个指针指向其实现,但是纯虚函数又是如何的情况呢?如下面的例子:
#include <stdio.h>
#include <iostream>
using namespace std;
class base
{
public:
virtual void show()
{
cout<<"\n Base class show:";
display();
}
virtual void display() = 0;
};
class derive:public base
{
public:
void display()
{
cout<<"\n Derive class display:";
}
void show()
{
cout<<"\n Derive class show:";
base::show();
}
};
int main(int argc, char *argv[])
{
derive *p = new derive;
p->show();
return 0;
}
对于虚函数的show的调用,非常容易理解,但是在derive当中调用base::show(),而在这个函数当中有调用了纯虚函数,其中基类的纯虚函数又是在基类里面不实现的。问题就在于,在基类里面调用纯虚函数会有什么样的结果,是不是一个正确的做法。实验证明上面的程序是没有问题的,基类里面是可以调用它的纯虚函数,上面的程序输出是:
Derive class show:
Base class show:
Derive class display:
所以,对于这个例子的解释,我个人参考相关的资料之后认为是这样的:对于纯虚函数vtable的指针指向其具体实现,所以在基类调用纯虚函数就等于调用了其在子类中的实现。