zoukankan      html  css  js  c++  java
  • C++虚函数作用原理(二)——类的继承

    上一篇博客

    C++虚函数作用原理(一)

    开始

    上一篇博客我们了解了虚函数到底是怎么存在的,那么这一篇我们就要开始考虑:虚函数的继承问题了。
    首先我们可以回忆一下,我们之前在学习继承的时候存在函数覆盖这个概念。如果没有函数覆盖,那么当我们调用子类中和父类同名函数时,就会出现二义性,编译器无法知道你到底需要哪一个函数。那么对于虚函数的继承我们是不是也应该考虑同名函数的覆盖问题呢?————当然应该,那么这里我们就来通过代码验证一下:

    class A
    {
    	int x;
    	int y;
    public:
    	virtual void out()
    	{
    		cout << x << y << endl;
    		cout << "A" << endl;
    	}
    	virtual void out_1()
    	{
    		cout << x << y << endl;
    	}
    	
    };
    class B :public A
    {
    	void cout_1()
    	{
    		cout << "B"<<endl;
    	}
    	virtual void cout_4()//重写的一个虚函数
    	{
    		cout << "B1"<<endl;
    	}
    };
    int main()
    {
    	A a;
    	B b;
    	return 0;
    }
    因为自己的学历有限可能会出现一些错误
    ##成员的分布:
    ![](https://img2018.cnblogs.com/blog/1784621/201911/1784621-20191112193103062-1815640229.png)
    这个图中我们可以知道:
    继承类B完全继承了A的所有成员,并且我们发现B只有虚函数表指针和A的虚函数表指针不一样,但是被B重写的函数<span style="color:red">void out()</span>的地址是与A的地址一样这就说明继承类把父类的虚函数覆盖了。这里就验证了虚函数覆盖这一说法!
    <span style="color:red">备注:</span>这里我们也可以观察到B类单独写的虚函数
    

    virtual void cout_4()//重写的一个虚函数
    {
    cout << "B1"<<endl;
    }

    并没有出现在虚函数表指针指向的表里面,它真的不在吗?当然不是,只是我们看不到而已。现在我们写一段代码来看看他到底在虚函数表里面吗?
    

    int main()
    {
    A a;
    B b;
    cout << "继承来的函数——void out()的地址:" << (int)(int )&b << endl;
    cout << "继承来的函数——void out_1()的地址:" << (((int
    )(int )&b)+1)<< endl;
    cout << "B类自己的函数——void out_4()的地址:" << (((int
    )
    (int *)&b) + 2) << endl;
    return 0;
    }

    ####运行结果:
    ![](https://img2018.cnblogs.com/blog/1784621/201911/1784621-20191112194751331-2082567926.png)
    这段代码运行的结果告诉我们其实,子类自己写的虚函数是在虚函数的表里面的只是没有显示出来。
  • 相关阅读:
    笔记:Oracle SQL 高级编程 第2章 SQL 执行
    python 中的 filter, lambda, map, reduce 内置函数
    笔记:Oracle SQL 高级编程 第1章 SQL 核心
    java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
    使用JDBC进行批处理
    程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
    教你如何迅速秒杀掉:99%的海量数据处理面试题
    十道海量数据处理面试题与十个方法大总结
    《Java 7 并发编程指南》学习概要 (7) 定制并发类
    HashMap多线程并发问题分析
  • 原文地址:https://www.cnblogs.com/kadcyh/p/11844497.html
Copyright © 2011-2022 走看看