C++虚函数与多态

 

一提起C++的多态,很自然就想起了函数重载和虚函数的实现。函数重载是在编译时实现的一种多态,而运行时的一种多态可以通过虚函数来实现。具体一点的例子就是通过基类指针指向其子类的实例,然后来调用实际子类的成员函数。既然说到虚函数,那么虚函数表必然要提一下;我想用例子来加深一下对这方面的认识:

  1. #include<iostream>   
  2. using namespace std;  
  3.    
  4. class Base  
  5. {  
  6. public:  
  7.          Base(){}  
  8.          virtual ~Base(){}  
  9.          int b_num;  
  10.   
  11.          virtual void func1(){cout<<"func1: In base~"<<endl;}  
  12.          virtual void func2(){cout<<"func2: In base~"<<endl;}  
  13. };  
  14.   
  15. class Derive: public Base  
  16. {  
  17. public:  
  18.          Derive(){}  
  19.          ~Derive(){}  
  20.   
  21.          int d_num;  
  22.          void func1(){cout<<"func1: In derive~"<<endl;}  
  23. };  
  24.   
  25. int main()  
  26. {  
  27.          cout<<sizeof(Base)<<"  "<<sizeof(Derive)<<endl;   
  28.   
  29.          Derive d;  
  30.          Base* b=&d;  
  31.          b->func1();  
  32.          b->func2();  
  33.   
  34.          return 0;  
  35. }  


输出:

8 12

func1: In derive~

func2: In base~

 

对于类的内存组织的描述

(1)类Base的内存组织类似于:

VPTR是一个虚函数表指针,指向该类的虚函数表。由上图可以看出Base类的内存空间存放了该指针以及一个整型的数据成员,因此该类的长度为8.

(2)类Derive的内存组织类似于:

由上图可知,在派生类中VPTR指向了该类的一个虚函数表,这个是从基类的虚函数表中来的;由于派生类Derive中覆盖了基类的func1虚函数,那么新的虚函数表也做了相应的覆盖。

在派生类的内存空间中,存储了虚函数表指针VPTR,基类的数据成员b_num,还有自身的数据成员d_num,因此sizeof(Derive)的长度为12.

由于func1的函数在派生类中被覆盖,通过基类指针指向的派生类的虚函数表中的是Derive::func1();而func2()函数没有被覆盖,因此指向的还是派生类中虚表的Base::func2().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值