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)
这段代码运行的结果告诉我们其实,子类自己写的虚函数是在虚函数的表里面的只是没有显示出来。

原文链接: https://www.cnblogs.com/kadcyh/p/11844497.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++虚函数作用原理(二)——类的继承

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/326357

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:47
下一篇 2023年3月1日 下午3:47

相关推荐