C++虚函数

关于虚函数看这里

虚函数的作用

虚函数的作用主要是实现了多态的机制,所谓多态,
就是一个基类指针或引用指向一个派生类实例,
然后通过基类指针调用派生类函数,达到一个用不同的代码实现不同的算法的目的。

虚函数表

有虚函数的类都有一个虚函数表指针,这个指针指向一个虚函数表,
虚函数表里有类的虚函数地址,这张表解决了继承,覆盖的问题。

没有虚函数重写的继承

没有虚函数重写就不会发生覆盖问题,
派生类直接继承基类的虚函数表。

有虚函数重写的继承

派生类继承的虚函数表只是一份拷贝,
对他进行改变不会影响基类的虚函数表,
如果派生类重写了基类的虚函数,
那么派生类中重写的函数地址会覆盖虚函数表中被重写函数的地址。

没有虚函数重写的多重继承

所谓的多重继承就是一个派生类继承多个基类,
这时派生类中会依继承顺序排放各自的虚函数指针,
而派生类的成员函数(虚函数)会放在第一个虚函数表中。

有虚函数重写的多重继承

如果有重写的虚函数,那么重写的函数地址会覆盖所有虚函数表中同名虚函数地址。
下图中,我们在子类中覆盖了父类的f()函数。
在这里插入图片描述
下面是对于子类实例中的虚函数表的图:
在这里插入图片描述
我们可以看见,三个父类虚函数表中的f()的位置被替换成了子类的函数指针。这样,我们就可以任一静态类型的父类来指向子类,并调用子类的f()了。如:

        Derive d;

        Base1 *b1 = &d;

        Base2 *b2 = &d;

        Base3 *b3 = &d;

        b1->f(); //Derive::f()

        b2->f(); //Derive::f()

        b3->f(); //Derive::f() 

        b1->g(); //Base1::g()

        b2->g(); //Base2::g()

        b3->g(); //Base3::g()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值