C++衍生類別的繼承方式總結:__C++

來源:互聯網
上載者:User
衍生類別的繼承方式總結:
繼承方式 說明
public 基類的public和protected的成員被衍生類別繼承後,保持原來的狀態
private 基類的public和protected的成員被衍生類別繼承後,變成衍生類別的private成員
protected

基類的public和protected的成員被衍生類別繼承後,變成衍生類別的protected成員

註:無論何種繼承方式,基類的private成員都不能被衍生類別訪問。從上面的表中可以看出,聲明為public的方法和屬性可以被隨意訪問;聲明為protected的方法和屬性只能被類本身和其子類訪問;而聲明為private的方法和屬性只能被當前類的對象訪問。    

1. 友元函數必須在類中進行聲明而在類外定義,聲明時須在函數傳回型別前面加上關鍵字friend。友元函數雖不是類的成員函數,但它可以訪問類中的私人和保護類型資料成員。  

2. 虛函數在重新定義時參數的個數和類型必須和基類中的虛函數完全符合,這一點和函數重載完全不同。  

3. #include <檔案名稱>和#include "檔案名稱"   檔案包含的兩種格式中,第一種格式用來包含那些由系統提供的並放在指定子目錄中的標頭檔;而第二種格式用來包含那些由使用者自己定義的放在目前的目錄或其他目錄下的標頭檔或其它源檔案。  

4. 數組也可以作為函數的實參和形參,若數組元素作為函數的實參,則其用法與變數相同。當數組名作為函數的實參和形參時,傳遞的是數組的地址。當進行按值傳遞的時候,所進行的值傳送是單向的,即只能從實參傳向形參,而不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用數組名作為函數參數進行傳遞時,由於實際上實參和形參為同一數組,因此當形參數組發生變化時,實參數組也隨之發生變化。  

註:實參數組與形參數群組類型應一致,如不一致,結果將出錯;形參數組也可以不指定大小,在定義數組時數組名後面跟一個空的方括弧,為了在被調用函數中處理數組元素的需要,可以另設一個參數,傳遞數組元素的個數。如:int sum(int array[],int n);  

5. 重載、覆蓋和隱藏的區別。  

函數的重載是指C++允許多個同名的函數存在,但同名的各個函數的形參必須有區別:形參的個數不同,或者形參的個數相同,但參數類型有所不同。 

覆蓋(Override)是指衍生類別中存在重新定義的函數,其函數名、參數列、傳回值類型必須同父類中的相對應被覆蓋的函數嚴格一致,覆蓋函數和被覆蓋函數只有函數體 (花括弧中的部分)不同,當衍生類別對象調用子類中該同名函數時會自動調用子類中的覆蓋版本,而不是父類中的被覆蓋函數版本,這種機制就叫做覆蓋。

下面我們從成員函數的角度來講述重載和覆蓋的區別。

成員函數被重載的特徵有: 1) 相同的範圍(在同一個類中);2) 函數名字相同;3) 參數不同;4) virtual關鍵字可有可無。

覆蓋的特徵有: 1) 不同的範圍(分別位於衍生類別與基類);2) 函數名字相同;3) 參數相同;4) 基類函數必須有virtual關鍵字。

比如,在下面的程式中: #include  < iostream.h >
class  Base
{
public :
void  f( int  x){ cout  <<   " Base::f(int)  "   <<  x  <<  endl; }
void  f( float  x){ cout  <<   " Base::f(float)  "   <<  x  <<  endl; }
virtual   void  g( void ){ cout  <<   " Base::g(void) "   <<  endl;}
};

class  Derived :  public  Base
{
public :
virtual   void  g( void ){ cout  <<   " Derived::g(void) "   <<  endl;}
};

void  main( void )
{
Derived d;
Base  * pb  =   & d;
pb -> f( 42 );  //  運行結果: Base::f(int) 42
pb -> f( 3.14f );  //  運行結果: Base::f(float) 3.14
pb -> g();  //  運行結果: Derived::g(void)
}

 

函數Base::f(int)與Base::f(float)相互重載,而Base::g(void)被Derived::g(void)覆蓋。

隱藏是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下: 1) 如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。2) 如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

比如,在下面的程式中:

#include  < iostream.h >

class

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.