C++虚函数探索!

C++中的虚函数实现了C++中的多态。昨天C++老师着重讲了讲虚函数。这个很重要,也有点玄机在里面。

下面阐述一下理论:

C++的类机制中有支持多态的技术来解决抽象编程。使用的是滞后捆绑技术。即预先设定其成员函数虚函数性质,使得任何捆绑该成员函数的未定类型

的对象操作在编译时,都是以一个不确定的指针特殊地“引命待发”来编码,运行时,遇到确定类型的对象,才突然制定真正的行为。

然后是一个示例程序:

复制代码
#include < iostream >
using   namespace  std;
class  A{
public :
       
virtual   void  showMessage(){
               cout
<< " 我是A! " << endl;
               }  
       A(){};
       A(
const  A &  a){
           cout
<< " 调用A的构造函数 " << endl;
           }   
      };
class  B: public  A{
public :  
        
virtual   void  showMessage(){
               cout
<< " 我是B! " << endl;
               }        
      };
int  main(){
    B b;
    A 
* p = new  B;
    ((A)b).showMessage();
    ((A
* )p) -> showMessage();
    
return   0 ;
    }
复制代码

 

 你先不要往下看,想想会输出什么?

----------------------------------------------------------------------------------

这个程序会输出:

调用A的构造函数

我是A!

我是B!


下面说一下原理,虚函数本身在编译过程中,会产生一个虚函数指针,而这个虚函数指针会指向一个虚表,虚表中

存有虚函数的地址,指向虚函数的方法。

一旦基类A的指针指向B(B继承A),基类中虚函数指针就会被继承的子对象的虚函数指针所覆盖。

那么就知道为什么会输出我是B!了。

理解这个之前还要知道:

1.父类声明虚函数子类同名函数自动也成为虚函数。

2.虚函数不能实例化,只能定义指针。

3.拥有纯虚函数的类就是抽象类。

下面在解释为什么输出,我是A!

因为从输出结果就可以看出,b对象经过强制类型转换成A以后,调用了A的构造函数。

所以A中的虚指针被恢复。所以输出了我是A!

下面是定义虚函数的五条限制:

1.只有类成员函数才能声明为虚函数。

2.静态成员函数不能是虚函数

3.内联函数不能是虚函数

4.构造函数不能是虚函数

5.析构函数可以是虚函数且通常声明为虚函数。

 本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/19/1358297.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值