zoukankan      html  css  js  c++  java
  • 虚函数与纯虚函数

    前言

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

    虚函数表

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

    虚函数

    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”

  • 相关阅读:
    秘密花园—那段岁月
    测试那些事儿—软测必备的Linux知识(三)
    测试那些事儿—软测必备的Linux知识(二)
    SharePoint 2010以其他用户身份登录的弹出代码
    JavaScript中cookie的路径(path)和域(domain)
    JavaScript变量不同类型之间的自动、手动类型转换
    编程习惯
    JavaScript的算术、赋值、关系运算符的讲解
    JavaScript的变量命名规则和关键字的介绍
    如何编写及运行JS
  • 原文地址:https://www.cnblogs.com/yunlambert/p/9191784.html
Copyright © 2011-2022 走看看