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.析构函数可以是虚函数且通常声明为虚函数。

 

推荐好好运行和分析第一条评论里的程序,那位老师的体会比我深。

转载注明:www.cnblogs.com/shiyangxt

 

posted on 2008-12-19 13:53  施杨  阅读(934)  评论(4编辑  收藏  举报

导航