虚函数覆盖

来源:互联网 发布:联合国合法席位知乎 编辑:程序博客网 时间:2024/05/01 07:56

 

1。覆盖函数,即在子类中用相同的函数名和签名重写父类的方法,虚函数,在子类中用相同的函数名和签名重写父类的方法(前面有virtual关键字)。如下   
        class   Father   
        {   
        public:   
                void   FunctionA()   const     
                {     
                        cout   <<   "This   is   FunctionA   of   class   Father."   <<   endl;   
                }     
                virtual   void   FunctionB()   const   
                {   
                        cout   <<   "This   is   FunctionB   of   class   Father."   <<   endl;   
                }   
        };   
    
        class   Child   :   public   Father   
        {   
        public:   
                void   FunctionA()   const     
                {   
                        cout   <<   "This   is   FunctionA   of   class   Child."   <<   endl;     
                }   
                virtual   void   FunctionB()   const   
                {   
                        cout   <<   "This   is   FunctionB   of   class   Child."   <<   endl;   
                }   
        };  

2。在将父类对象的指针指向子类对象的时候   Father*   father   =   new   Child;   
              如father->FunctionA(),则执行的是Father中的实现;father->FunctionB(),   
              则执行的是Child中的实现。   
 3。如果直接声明子类对象,Child   child;则无论child.FunctionA()还是           child.FunctionB(),执行的都是Child中的实现。   
    
  总结:调用函数的时候,关键看对象的类型 。   
  记住是对象的类型,不管是指针还是引用(同样是对象的类型)。   
  好了有了对象的类型就好办了。当你用这个对象(或者是指针、引用)去调用函数时,   
      1:该对象(实体)即不是指针或引用的形式,可以轻松的调用函数。   
      2:但是当我们用引用或指针形式时,有个问题是区别指针(引用)的类型和指针(引用)所指实体对象的类型。

  
        A:你用指针来调用某函数,若函数是非虚函数,非虚函数是静态编译的(即编译时刻确定的)。也就是说他不会去虚函数表找这个函数(因为不是虚函数),因 此调用的是指针类型的那个类的相关函数。即使派生类有这个函数(这是实际编程时的大忌!!!)。这就是  你的void   FunctionA()   const   ;   
        B:   当你用这个指针去调用一个虚函数时,他就到虚函数表中,找这个名字的函数,从指针所指对象的类型(即派生类)依次向父类走,直到遇到第一个与次匹配的函数名。    

 

还有一篇虚函数表讲解的文章,见http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx

 

原创粉丝点击