AKever

导航

Cpp Virtual 关键字(覆盖\重载\隐藏)

Cpp Virtual 关键字(覆盖\重载\隐藏)

Virtual是C++ OO机制很重要的关键字。派生类通过重写基类的虚拟函数来实现对基类虚拟函数的覆盖。这是C++面向对象中多态的体现。

覆盖函数都是虚函数,反之不然~~

class Base 
{ 
   public:Base(){} 
   public: 
       virtual void print()
       {
          cout<<"Base"<<endl;
       } 
};   
class Derived:public Base 
{ 
   public:Derived(){} 
   public: 
       void print()
       {
          cout<<"Derived"<<endl;
       } 
};   
int main() 
{ 
       Base *point=new Derived(); 
       point->print(); 
} 
//--------------------------------------------------------- 
Output: 
Derived 
//---------------------------------------------------------

 

||========================================================||

覆盖区别于 重载,隐藏

重载:重载的函数必须函数名相同,参数不同。重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。

      函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数。

隐藏:指的是派生类的成员函数隐藏了基类函数的成员函数。

     隐藏一词可以这么理解: 在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了

     如果一个派生类和一个基类都有同一个同名(不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义....

   隐藏的关系只有如下的可能:

   1)必须分别位于派生类和基类中
   2)必须同名
   3)参数不同的时候本身已经不构成覆盖关系了,所以此时是否是virtual函数已经不重要了
    当参数相同的时候就要看时候有virtual关键字了,有的话就是覆盖关系,没有的时候就是隐藏关系了

posted on 2014-03-28 12:51  AKever  阅读(671)  评论(0)    收藏  举报