詳解C++編程中的公有繼續和私有繼續。本站提示廣大學習愛好者:(詳解C++編程中的公有繼續和私有繼續)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的公有繼續和私有繼續正文
C++類的公有繼續
在聲明一個派生類時將基類的繼續方法指定為private的,稱為公有繼續,用公有繼續方法樹立的派生類稱為公有派生類(private derived class ), 其基類稱為公有基類(private base class )。
公有基類的公用成員和掩護成員在派生類中的拜訪屬性相當於派生類中的公有成員,即派生類的成員函數能拜訪它們,而在派生類外不克不及拜訪它們。公有基類的公有成員在派生類中成為弗成拜訪的成員,只要基類的成員函數可以援用它們。一個基類成員在基類中的拜訪屬性和在派生類中的拜訪屬性能夠是分歧的。公有基類的成員在公有派生類中的拜訪屬性見下表。
上表不用逝世記硬背,只需懂得:既然聲明為公有繼續,就表現將本來能被外界援用的成員隱蔽起來,不讓外界援用,是以公有基類的公用成員和掩護成員天經地義地成為派生類中的公有成員。
公有基類的公有成員按劃定只能被基類的成員函數援用,在基類外固然不克不及拜訪他們,是以它們在派生類中是隱藏的,弗成拜訪的。
關於不須要再往下繼續的類的功效可以用公有繼續方法把它隱藏起來,如許,下一層的派生類沒法拜訪它的任何成員。可以曉得,一個成員在分歧的派生條理中的拜訪屬性能夠是分歧的,它與繼續方法有關。
[例]
class Student1: private Student//用公有繼續方法聲明派生類Student1 { public: void display_1( ) //輸入兩個數據成員的值 { cout<<"age: "<<age<<endl; //援用派生類的公有成員,准確 cout<<"address: "<<addr<<endl; } //援用派生類的公有成員,准確 private: int age; string addr; };
請剖析上面的主函數:
int main( ) { Student1 stud1;//界說一個Student1類的對象stud1 stud1.display(); //毛病,公有基類的公用成員函數在派生類中是公有函數 stud1.display_1( );//准確,Display_1函數是Student1類的公用函數 stud1.age=18; //毛病,外界不克不及援用派生類的公有成員 return 0; }
可以看到:
不克不及經由過程派生類對象(如stud1)援用從公有基類繼續過去的任何成員(如stud1.display()或stud1.num)。
派生類的成員函數不克不及拜訪公有基類的公有成員,但可以拜訪公有基類的公用成員(如stud1.display_1函數可以挪用基類的公用成員函數display,但不克不及援用基類的公有成員num)。
很多讀者提出如許一個問題:公有基類的公有成員mun等數據成員只能被基類的成員函數援用,而公有基類的公用成員函數又不克不及被派生類外挪用,那末,有無方法挪用公有基類的公用成員函數,從而援用公有基類的公有成員呢?有。
應該留意到,固然在派生類外不克不及經由過程派生類對象挪用公有基類的公用成員函數,但可以經由過程派生類的成員函數挪用公有基類的公用成員函數(此時它是派生類中的公有成員函數,可以被派生類的任何成員函數挪用)。
可將下面的公有派生類的成員函數界說改寫為:
void display_1( )//輸入5個數據成員的值 { display(): //挪用基類的公用成員函數,輸入3個數據成員的值 cout<<"age: "<<age<<endl; //輸入派生類的公有數據成員 cout<<"address: "<<addr<<endl; } //輸入派生類的公有數據成員
main函數可改寫為:
int main( ) { Student1 stud1; stud1.display_1( );//display_1函數是派生類Student1類的公用函數 return 0; }
如許就可以准確地援用公有基類的公有成員。可以看到,本例采取的辦法是:
在main函數中挪用派生類中的公用成員函數stud1.display_1;
經由過程該公用成員函數挪用基類的公用成員函數display(它在派生類中是公有函數,可以被派生類中的任何成員函數挪用);
經由過程基類的公用成員函數display援用基類中的數據成員。
請依據下面的請求,彌補和完美下面的法式,使之成為完全、准確的法式,法式中應包含輸出數據的函數。
因為公有派生類限制太多,應用不便利,普通不常應用。
C++類的公用繼續
在界說一個派生類時將基類的繼續方法指定為public的,稱為公用繼續,用公用繼續方法樹立的派生類稱為公用派生類(public derived class ),其基類稱為公用基類(public base class )。
采取公用繼續方法時,基類的公用成員和掩護成員在派生類中依然堅持其公用成員和掩護成員的屬性,而基類的公有成員在派生類中並沒有成為派生類的公有成員,它依然是基類的公有成員,只要基類的成員函數可以援用它,而不克不及被派生類的成員函數援用,是以就成為派生類中的弗成拜訪的成員。公用基類的成員在派生類中的拜訪屬性見表。
有人問,既然是公用繼續,為何不讓拜訪基類的公有成員呢?要曉得,這是C++中一個主要的軟件工程不雅點。由於公有成員表現了數據的封裝性,隱蔽公有成員有益於測試、調試和修正體系。假如把基類一切成員的拜訪權限都原封不動地繼續到派生類,使基類的公有成員在派生類中仍堅持其公有性質,派生類成員能拜訪基類的公有成員,那末難道基類和派生類沒有界線了?這就損壞了基類的封裝性。假如派生類再持續派生一個新的派生類,也能拜訪基類的公有成員,那末在這個基類的一切派生類的條理上都能拜訪基類的公有成員,這就完整拋棄了封裝性帶來的利益。掩護公有成員是一條主要的准繩。
[例] 拜訪私有基類的成員。上面寫出類的聲明部門:
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; //妄圖援用基類的公有成員,毛病 cout<<" name: "<<name<<endl; //妄圖援用基類的公有成員,毛病 cout<<" sex: "<<sex<<endl; //妄圖援用基類的公有成員,毛病 cout<<" age: "<<age<<endl; //援用派生類的公有成員,准確 cout<<" address: "<<addr<<endl; } //援用派生類的公有成員,准確 private: int age; string addr; };
因為基類的公有成員對派生類來講是弗成拜訪的,是以在派生類中的display_1函數中直接援用基類的公有數據成員num,name和sex是不許可的。只能經由過程基類的公用成員函數來援用基類的公有數據成員。可以將派生類Student1的聲明改成
class Student1: public Student //以public方法聲明派生類Student1 { public: void display_1( ) { cout<<" age: "<<age<<endl; //援用派生類的公有成員,准確 cout<<" address: "<<addr<<endl; //援用派生類的公有成員,准確 } private: int age; string addr; };
然後在main函數平分別挪用基類的display函數和派生類中的display_1函數,前後輸入5個數據。
可以如許寫main函數(假定對象stud中已稀有據):
int main( ) { Student1 stud;//界說派生類Student1的對象stud stud.display( ); //挪用基類的公用成員函數,輸入基類中3個數據成員的值 stud.display_1(); //挪用派生類公用成員函數,輸入派生類中兩個數據成員的值 return 0; }
請依據下面的剖析,寫出完全的法式,法式中應包含輸出數據的函數。
現實上,法式還可以改良,在派生類的display_1函數中挪用基類的display函數,在主函數中只需寫一行:
stud.display_1();
便可輸入5個數據。