C++虚函数实现原理

来源:互联网 发布:花生壳使用自己的域名 编辑:程序博客网 时间:2024/06/15 20:38

1、多态的实现机制

     C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。


2、实例

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Base  
  5. {  
  6. public:  
  7. virtual void fun1 () {cout<<" printf base fun1!" <<endl;}  
  8. virtual void fun2 () {cout<<" printf base fun2!" <<endl;}  
  9. private:  
  10. int m_data1;  
  11. } ;  
  12.   
  13. class Derive: public Base  
  14. {  
  15. public:  
  16. void fun1 () {cout<<" printf derive fun1!" <<endl;}  
  17. void fun3 () {cout<<" printf derive fun3" <<endl;}  
  18. private:  
  19. int m_data2;  
  20. } ;  
  21.   
  22. int main ()  
  23. {  
  24. Base *pBase=new Derive;  
  25. Derive a;  
  26. pBase->fun1 () ;  
  27. pBase->fun2 () ;  
  28. a.fun3 () ;  
  29. return 0;  
  30. }  

3、底层机制

在每一个含有虚函数的类对象中,都含有一个VPTR,指向虚函数表。


派生类也会继承基类的虚函数,如果宅派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。


当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。


4、多重继承

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream_h>  
  2. class base1  
  3. {  
  4. public:  
  5. virtual void vn(){}  
  6. private:  
  7. inti;  
  8. );  
  9. class base2  
  10. {  
  11. public:  
  12. virtual void vf2(){}  
  13. private:  
  14. intj;  
  15. );  
  16. class derived:public base 1,public base2  
  17. {  
  18. public:  
  19. virtual void vf3(){}  
  20. private:  
  21. int k:  
  22. );  
  23. void main()  
  24. {  
  25. derivedd:  
  26. base1 pl;  
  27. base2 p2;  
  28. pl=&d;p2 &d:  
  29. pl->vfl();  
  30. p2->vf2();  
  31. }  


如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样。

0 0
原创粉丝点击