虚函数

说一说虚函数

[1]虚函数:就是在类的成员函数的前面加virtual关键字
[2]虚函数通过虚函数表(虚表)来实现,虚表中存的是虚函数指针
[3]虚函数和普通函数一样的,都是存在代码段的,只是他的指针又存到了虚表中
[4]类的对象中存的是虚表指针(_vfptr),通过这个指针调用虚函数
[5]虚函数的调用会被编译器转换为对虚函数表的访问
[6]vs下虚表存在数据段
[7]虚函数表本质是一个存虚函数指针的指针数组,这个数组最后面放了一个nullptr

class Base
{
 public:
      virtual void Func1()
      {
         cout<<"Base::Func1()"<<endl;
       }
       virtual void Func2()
       {
         cout<<"Base::Func2()"<<endl;
       }
       void Func3()
       {
         cout<<"Base::Func3()"<<endl;
       }
 private:
       int _b=1;
};
class Derive::public Base
{
   public:
       virtual void Func1()
       {
          cout<<"Derive::Func1()"<<endl;
        }
    private:
       int _d=2;
};
int main()
{
  Base b;
  Derive d;

  return 0;
}
/*派生类对象d中也有一个虚表指针*/
/*基类b对象和派生类d对象虚表是不一样的,这里我们发现Func1完成了重写,所以d的虚表中存的是重写的Derive::Func1,所以虚函数的重写也叫作覆盖,
覆盖就是指虚表中虚函数的覆盖。重写是语法的叫法,覆盖是原理层的叫法。*/
/*派生类虚表的生成:1.先将基类中的虚表内容拷贝一份到派生类虚表中 2.若派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数
3.派生类自己新增加的虚函数按其在 派生类中的声明次序增加到派生类虚表的最后 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值