欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

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

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

私有基類(lèi)的私有成員按規(guī)定只能被基類(lèi)的成員函數(shù)引用,在基類(lèi)外當(dāng)然不能訪(fǎng)問(wèn)他們,因此它們?cè)谂缮?lèi)中是隱蔽的,不可訪(fǎng)問(wèn)的。

對(duì)于不需要再往下繼承的類(lèi)的功能可以用私有繼承方式把它隱蔽起來(lái),這樣,下一層的派生類(lèi)無(wú)法訪(fǎng)問(wèn)它的任何成員。可以知道,一個(gè)成員在不同的派生層次中的訪(fǎng)問(wèn)屬性可能是不同的,它與繼承方式有關(guān)。

[例]

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

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

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

可以看到:
不能通過(guò)派生類(lèi)對(duì)象(如stud1)引用從私有基類(lèi)繼承過(guò)來(lái)的任何成員(如stud1.display()或stud1.num)。
派生類(lèi)的成員函數(shù)不能訪(fǎng)問(wèn)私有基類(lèi)的私有成員,但可以訪(fǎng)問(wèn)私有基類(lèi)的公用成員(如stud1.display_1函數(shù)可以調(diào)用基類(lèi)的公用成員函數(shù)display,但不能引用基類(lèi)的私有成員num)。

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

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

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

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

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

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

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

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

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

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

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

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

[例] 訪(fǎng)問(wèn)公有基類(lèi)的成員。下面寫(xiě)出類(lèi)的聲明部分:

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

由于基類(lèi)的私有成員對(duì)派生類(lèi)來(lái)說(shuō)是不可訪(fǎng)問(wèn)的,因此在派生類(lèi)中的display_1函數(shù)中直接引用基類(lèi)的私有數(shù)據(jù)成員num,name和sex是不允許的。只能通過(guò)基類(lèi)的公用成員函數(shù)來(lái)引用基類(lèi)的私有數(shù)據(jù)成員??梢詫⑴缮?lèi)Student1的聲明改為

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

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

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

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

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

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

  stud.display_1();


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

上一篇:簡(jiǎn)單介紹C++編程中派生類(lèi)的析構(gòu)函數(shù)

欄    目:C語(yǔ)言

下一篇:詳解C++編程中的文件流與字符串流

本文標(biāo)題:詳解C++編程中的私有繼承和公有繼承

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2696.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有