最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++編程中的私有繼承和公有繼承

 更新時(shí)間:2015年09月21日 16:50:53   投稿:goldensun  
這篇文章主要介紹了詳解C++編程中的私有繼承和公有繼承,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

C++類的私有繼承
在聲明一個(gè)派生類時(shí)將基類的繼承方式指定為private的,稱為私有繼承,用私有繼承方式建立的派生類稱為私有派生類(private derived class ), 其基類稱為私有基類(private base class )。

私有基類的公用成員和保護(hù)成員在派生類中的訪問屬性相當(dāng)于派生類中的私有成員,即派生類的成員函數(shù)能訪問它們,而在派生類外不能訪問它們。私有基類的私有成員在派生類中成為不可訪問的成員,只有基類的成員函數(shù)可以引用它們。一個(gè)基類成員在基類中的訪問屬性和在派生類中的訪問屬性可能是不同的。私有基類的成員在私有派生類中的訪問屬性見下表。

上表不必死記硬背,只需理解:既然聲明為私有繼承,就表示將原來能被外界引用的成員隱藏起來,不讓外界引用,因此私有基類的公用成員和保護(hù)成員理所當(dāng)然地成為派生類中的私有成員。

私有基類的私有成員按規(guī)定只能被基類的成員函數(shù)引用,在基類外當(dāng)然不能訪問他們,因此它們在派生類中是隱蔽的,不可訪問的。

對于不需要再往下繼承的類的功能可以用私有繼承方式把它隱蔽起來,這樣,下一層的派生類無法訪問它的任何成員??梢灾溃粋€(gè)成員在不同的派生層次中的訪問屬性可能是不同的,它與繼承方式有關(guān)。

[例]

class Student1: private Student//用私有繼承方式聲明派生類Student1
{
public:
  void display_1( ) //輸出兩個(gè)數(shù)據(jù)成員的值
  {
   cout<<"age: "<<age<<endl; //引用派生類的私有成員,正確
   cout<<"address: "<<addr<<endl;
  } //引用派生類的私有成員,正確
private:
  int age;
  string addr;
};

請分析下面的主函數(shù):

int main( )
{
  Student1 stud1;//定義一個(gè)Student1類的對象stud1
  stud1.display(); //錯(cuò)誤,私有基類的公用成員函數(shù)在派生類中是私有函數(shù)
  stud1.display_1( );//正確,Display_1函數(shù)是Student1類的公用函數(shù)
  stud1.age=18; //錯(cuò)誤,外界不能引用派生類的私有成員
  return 0;
}

可以看到:
不能通過派生類對象(如stud1)引用從私有基類繼承過來的任何成員(如stud1.display()或stud1.num)。
派生類的成員函數(shù)不能訪問私有基類的私有成員,但可以訪問私有基類的公用成員(如stud1.display_1函數(shù)可以調(diào)用基類的公用成員函數(shù)display,但不能引用基類的私有成員num)。

不少讀者提出這樣一個(gè)問題:私有基類的私有成員mun等數(shù)據(jù)成員只能被基類的成員函數(shù)引用,而私有基類的公用成員函數(shù)又不能被派生類外調(diào)用,那么,有沒有辦法調(diào)用私有基類的公用成員函數(shù),從而引用私有基類的私有成員呢?有。

應(yīng)當(dāng)注意到,雖然在派生類外不能通過派生類對象調(diào)用私有基類的公用成員函數(shù),但可以通過派生類的成員函數(shù)調(diào)用私有基類的公用成員函數(shù)(此時(shí)它是派生類中的私有成員函數(shù),可以被派生類的任何成員函數(shù)調(diào)用)。

可將上面的私有派生類的成員函數(shù)定義改寫為:

void display_1( )//輸出5個(gè)數(shù)據(jù)成員的值
{
  display(): //調(diào)用基類的公用成員函數(shù),輸出3個(gè)數(shù)據(jù)成員的值
  cout<<"age: "<<age<<endl; //輸出派生類的私有數(shù)據(jù)成員
  cout<<"address: "<<addr<<endl;
} //輸出派生類的私有數(shù)據(jù)成員

main函數(shù)可改寫為:

int main( )
{
  Student1 stud1;
  stud1.display_1( );//display_1函數(shù)是派生類Student1類的公用函數(shù)
  return 0;
}

這樣就能正確地引用私有基類的私有成員??梢钥吹?,本例采用的方法是:
在main函數(shù)中調(diào)用派生類中的公用成員函數(shù)stud1.display_1;
通過該公用成員函數(shù)調(diào)用基類的公用成員函數(shù)display(它在派生類中是私有函數(shù),可以被派生類中的任何成員函數(shù)調(diào)用);
通過基類的公用成員函數(shù)display引用基類中的數(shù)據(jù)成員。

請根據(jù)上面的要求,補(bǔ)充和完善上面的程序,使之成為完整、正確的程序,程序中應(yīng)包括輸入數(shù)據(jù)的函數(shù)。

由于私有派生類限制太多,使用不方便,一般不常使用。

C++類的公用繼承
在定義一個(gè)派生類時(shí)將基類的繼承方式指定為public的,稱為公用繼承,用公用繼承方式建立的派生類稱為公用派生類(public derived class ),其基類稱為公用基類(public base class )。

采用公用繼承方式時(shí),基類的公用成員和保護(hù)成員在派生類中仍然保持其公用成員和保護(hù)成員的屬性,而基類的私有成員在派生類中并沒有成為派生類的私有成員,它仍然是基類的私有成員,只有基類的成員函數(shù)可以引用它,而不能被派生類的成員函數(shù)引用,因此就成為派生類中的不可訪問的成員。公用基類的成員在派生類中的訪問屬性見表。

有人問,既然是公用繼承,為什么不讓訪問基類的私有成員呢?要知道,這是C++中一個(gè)重要的軟件工程觀點(diǎn)。因?yàn)樗接谐蓡T體現(xiàn)了數(shù)據(jù)的封裝性,隱藏私有成員有利于測試、調(diào)試和修改系統(tǒng)。如果把基類所有成員的訪問權(quán)限都原封不動(dòng)地繼承到派生類,使基類的私有成員在派生類中仍保持其私有性質(zhì),派生類成員能訪問基類的私有成員,那么豈非基類和派生類沒有界限了?這就破壞了基類的封裝性。如果派生類再繼續(xù)派生一個(gè)新的派生類,也能訪問基類的私有成員,那么在這個(gè)基類的所有派生類的層次上都能訪問基類的私有成員,這就完全丟棄了封裝性帶來的好處。保護(hù)私有成員是一條重要的原則。

[例] 訪問公有基類的成員。下面寫出類的聲明部分:

Class Student//聲明基類
{
public: //基類公用成員
  void get_value( )
  {
   cin>>num>>name>>sex;
  }
  void display( )
  {
   cout<<" num: "<<num<<endl;
   cout<<" name: "<<name<<endl;
   cout<<" sex: "<<sex<<endl;
  }
private: //基類私有成員
  int num;
  string name;
  char sex;
};
class Student1: public Student //以public方式聲明派生類Student1
{
public:
  void display_1( )
  {
   cout<<" num: "<<num<<endl; //企圖引用基類的私有成員,錯(cuò)誤
   cout<<" name: "<<name<<endl; //企圖引用基類的私有成員,錯(cuò)誤
   cout<<" sex: "<<sex<<endl; //企圖引用基類的私有成員,錯(cuò)誤
   cout<<" age: "<<age<<endl; //引用派生類的私有成員,正確
   cout<<" address: "<<addr<<endl;
  } //引用派生類的私有成員,正確
private:
  int age;
  string addr;
};

由于基類的私有成員對派生類來說是不可訪問的,因此在派生類中的display_1函數(shù)中直接引用基類的私有數(shù)據(jù)成員num,name和sex是不允許的。只能通過基類的公用成員函數(shù)來引用基類的私有數(shù)據(jù)成員??梢詫⑴缮怱tudent1的聲明改為

class Student1: public Student //以public方式聲明派生類Student1
{
public:
  void display_1( )
  {
   cout<<" age: "<<age<<endl; //引用派生類的私有成員,正確
   cout<<" address: "<<addr<<endl; //引用派生類的私有成員,正確
  }
private:
  int age; string addr;
};

然后在main函數(shù)中分別調(diào)用基類的display函數(shù)和派生類中的display_1函數(shù),先后輸出5個(gè)數(shù)據(jù)。

可以這樣寫main函數(shù)(假設(shè)對象stud中已有數(shù)據(jù)):

int main( )
{
  Student1 stud;//定義派生類Student1的對象stud
  stud.display( ); //調(diào)用基類的公用成員函數(shù),輸出基類中3個(gè)數(shù)據(jù)成員的值
  stud.display_1(); //調(diào)用派生類公用成員函數(shù),輸出派生類中兩個(gè)數(shù)據(jù)成員的值
  return 0;
}

請根據(jù)上面的分析,寫出完整的程序,程序中應(yīng)包括輸入數(shù)據(jù)的函數(shù)。

實(shí)際上,程序還可以改進(jìn),在派生類的display_1函數(shù)中調(diào)用基類的display函數(shù),在主函數(shù)中只要寫一行:

  stud.display_1();


即可輸出5個(gè)數(shù)據(jù)。

相關(guān)文章

  • C語言實(shí)現(xiàn)三子棋游戲(初級版)

    C語言實(shí)現(xiàn)三子棋游戲(初級版)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋游戲初級版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++基本算法思想之遞推算法思想

    C++基本算法思想之遞推算法思想

    遞推算法需要用戶知道答案和問題之間的邏輯關(guān)系。在許多數(shù)學(xué)問題中,都有明確的計(jì)算公式可以遵循,因此可以采用遞推算法來實(shí)現(xiàn)
    2013-10-10
  • C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題

    C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題

    這篇文章主要介紹了C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++按照正態(tài)分布來排列整型數(shù)組元素

    C++按照正態(tài)分布來排列整型數(shù)組元素

    這篇文章主要介紹了C++按照正態(tài)分布來排列整型數(shù)組元素的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 使用MinGW使Windows通過gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法

    使用MinGW使Windows通過gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法

    這篇文章主要介紹了使用MinGW使Windows通過gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表操作詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表操作詳解

    鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的常用操作,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • C++20中std::format的示例代碼

    C++20中std::format的示例代碼

    本文詳細(xì)介紹了C++20中std::format的功能、使用方法和高級應(yīng)用,包括基本用法、數(shù)字和文本的格式化、日期和時(shí)間的處理、自定義類型的格式化等,感興趣的可以了解一下
    2024-10-10
  • C語言中遞歸和排列組合詳解

    C語言中遞歸和排列組合詳解

    大家好,本篇文章主要講的是C語言中遞歸和排列組合詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 用C++實(shí)現(xiàn)推箱子

    用C++實(shí)現(xiàn)推箱子

    這篇文章主要為大家詳細(xì)介紹了用C++實(shí)現(xiàn)推箱子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C++如何用數(shù)組模擬鏈表

    C++如何用數(shù)組模擬鏈表

    大家好,本篇文章主要講的是C++如何用數(shù)組模擬鏈表,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論

宁强县| 丹阳市| 无锡市| 白城市| 翁源县| 洪洞县| 佛学| 太湖县| 宜宾县| 湘西| 中西区| 扎鲁特旗| 兰西县| 拜泉县| 嘉兴市| 鱼台县| 宁城县| 新民市| 华亭县| 水富县| 肇庆市| 赣榆县| 邮箱| 兴山县| 逊克县| 金沙县| 咸宁市| 唐海县| 老河口市| 临江市| 全州县| 巨野县| 米林县| 巫山县| 定州市| 山东省| 合作市| 随州市| 民乐县| 车险| 怀化市|