• 虚函数与纯虚函数


    前言

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

    虚函数表

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

    虚函数

    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”

  • 相关阅读:
    [BZOJ3043]IncDec Sequence
    【NOIP2015】字串
    [NOIP]2016天天爱跑步
    【NOIP2015】运输计划
    [poj3565]Ants
    【ZOJ2760】How Many Shortest Path
    [POJ3281] Dining
    P1077摆花
    校内测之zay与银临 (day2)
    P1880石子合并
  • 原文地址:https://www.cnblogs.com/yunlambert/p/9191784.html
Copyright © 2020-2023  润新知