虚函数与纯虚函数

前言

最近面试的时候面试官问了这样的问题,自己虽然大致知道他们之间的区别,但当时面试时有些逻辑混乱。所以面试完想好好总结一番。

虚函数表

虚函数是通过一张虚函数表实现的,在这个表中主要是一个雷的虚函数的地址表;这张表解决了继承、覆盖的问题。在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以当我们用父类的指针来操作一个子类的时候,这张函虚函数表就可以为我们指明实际所应该调用的函数。
关于虚函数,可以参考这篇博客

虚函数

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”

posted @ 2018-06-16 23:43  MrYun  阅读(207)  评论(0编辑  收藏  举报