前言
最近面试的时候面试官问了这样的问题,自己虽然大致知道他们之间的区别,但当时面试时有些逻辑混乱。所以面试完想好好总结一番。
虚函数表
虚函数是通过一张虚函数表实现的,在这个表中主要是一个雷的虚函数的地址表;这张表解决了继承、覆盖的问题。在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以当我们用父类的指针来操作一个子类的时候,这张函虚函数表就可以为我们指明实际所应该调用的函数。
关于虚函数,可以参考这篇博客
虚函数
C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。简要来说就是子类可以重写父类的虚函数实现子类的特殊化。
如果子类中有虚函数重载了父类的虚函数,那么在虚函数表中,子类的虚函数会将原来父类虚函数的内存地址进行覆盖。在实际调用发生时,调用的就是子类中的重载函数。
纯虚函数
纯虚函数在基类中是没有定义的,必须在子类中加以实现!
定义一个函数为虚函数,不代表函数为不被实现的函数,而是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现,而是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
一个例子
#include<iostream>
using namespace std;
class A
{
public:
A()
{
printf("A ");
}
virtual ~A()
{
printf("deA ");
}
};
class B
{
public:
B()
{
printf("B ");
}
virtual ~B()
{
printf("deB ");
}
};
class C : public A, public B
{
public:
C()
{
printf("C ");
}
~C()
{
printf("deC ");
}
};
int main()
{
A *a = new C();
delete a;
system("pause");
return 0;
}
结果是“A B C deC deB deA”