一.繼承的含義
創(chuàng)新互聯(lián)建站是專(zhuān)業(yè)的大通網(wǎng)站建設(shè)公司,大通接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行大通網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!繼承是面向?qū)ο髲?fù)用的重要手段。通過(guò)繼承定義一個(gè)類(lèi),它們的類(lèi)型之間的關(guān)系建模,共享公有的東西,實(shí)現(xiàn)各自本質(zhì)不同的東西。
二.繼承關(guān)系與訪問(wèn)限定符
有如下總結(jié):
1.基類(lèi)的私有成員在派生類(lèi)中是不能被訪問(wèn)的,如果一些基類(lèi)成員不想被基類(lèi)對(duì)象直接訪問(wèn),但需要在派生類(lèi)中能訪問(wèn),就定義為保護(hù)成員。可以看出保護(hù)成員限定符是因繼承才出現(xiàn)的。
例如:
class Date { public: Date() { cout << "Date()" << endl; } ~Date() { cout << "~Date()" << endl; } void Display() { cout << _year << "-" << _month << "-" << _day << endl; } public: int _year; protected: int _month; private: int _day; }; class Time : public Date { public: Time() { cout << "Date()" << endl; } ~Time() { cout << "~Date()" << endl; } void Display() { cout << _year << "-"; cout << _month << "-"; //cout<< _day << "-"; //派生類(lèi)中不能訪問(wèn)基類(lèi)的private成員。 cout << _hour << "-" << _minute << "-" << _second << endl; } public: int _hour; protected: int _minute; private: int _second; };
2.public繼承是一個(gè)接口繼承,保持is-a原則,每個(gè)父類(lèi)可用的成員對(duì)子類(lèi)也可用,因?yàn)槊總€(gè)子類(lèi)對(duì)象也都是一個(gè)父類(lèi)對(duì)象。
void Test1() { Time t; Date t1; //t = t1; //父類(lèi)對(duì)象不可以給子類(lèi)對(duì)象賦值 t1 = t; //子類(lèi)對(duì)象不可以給父類(lèi)對(duì)象賦值 Time* p1 = NULL; Date* p2 = NULL; p2 = &t; //父類(lèi)的指針/引用可以指向子類(lèi)對(duì)象 //p1 = &t1; //子類(lèi)的指針/引用不能指向父類(lèi)對(duì)象(可以通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換完成) t._hour = 0; }
3.protetced/private繼承是一個(gè)實(shí)現(xiàn)繼承,基類(lèi)的部分成員并未完全成為子類(lèi)接口的一部分,是 has-a 的關(guān)系原則。
4. 不管是哪種繼承方式,在派生類(lèi)內(nèi)部都可以訪問(wèn)基類(lèi)的公有成員和保護(hù)成員,但是基類(lèi)的私有成員存在但是在子類(lèi)中不可見(jiàn)(不能訪問(wèn))。
class Date { public: Date() { cout << "Date()" << endl; } ~Date() { cout << "~Date()" << endl; } void Display() { cout << _year << "-" << _month << "-" << _day << endl; } public: int _year; protected: int _month; private: int _day; }; class Time : protected Date { public: Time() { cout << "Date()" << endl; } ~Time() { cout << "~Date()" << endl; } void Display() { cout << _year << "-"; cout << _month << "-"; //cout<< _day << "-"; cout << _hour << "-" << _minute << "-" << _second << endl; } public: int _hour; protected: int _minute; private: int _second; }; void test2() { Time t; t._year = 0; t._month = 0; //不能在外界訪問(wèn)父類(lèi)的公有成員和保護(hù)成員。 t._hour = 0; }
5.使用關(guān)鍵字class時(shí)默認(rèn)的繼承方式是private,使用struct時(shí)默認(rèn)的繼承方式是public,不過(guò)最好顯示的寫(xiě)出繼承方式。
6.繼承體系中的作用域
(1).繼承體系中基類(lèi)和派生類(lèi)都有獨(dú)立的作用域。
(2).子類(lèi)和父類(lèi)中有同名成員,子類(lèi)成員將屏蔽父類(lèi)對(duì)成員的直接訪問(wèn)。(在子類(lèi)成員函數(shù)中,可以使用 基類(lèi)::基類(lèi)成員 訪問(wèn))--隱藏
class Date { public: Date() { cout << "Date()" << endl; } ~Date() { cout << "~Date()" << endl; } void Display() { cout << _year << "-" << _month << "-" << _day << endl; } public: int _year; protected: int _month; private: int _day; }; class Time : protected Date { public: Time() { cout << "Date()" << endl; } ~Time() { cout << "~Date()" << endl; } void Display() { Date::Display(); //可以通過(guò)這樣的方式訪問(wèn) cout << _hour << "-" << _minute << "-" << _second << endl; } public: int _hour; protected: int _minute; private: int _second; }; void test3() { Time t; t.Display(); //在外部調(diào)用,調(diào)用的是父類(lèi)的函數(shù) }
三.派生類(lèi)的成員函數(shù)
在繼承關(guān)系里面,在派生類(lèi)中如果沒(méi)有顯示定義這六個(gè)成員函數(shù),編譯系統(tǒng)則會(huì)默認(rèn)合成這六個(gè)默認(rèn)的成員函數(shù)。且會(huì)調(diào)用父類(lèi)的構(gòu)造函數(shù)。
class Date { public: Date() { cout << "Date()" << endl; } ~Date() { cout << "~Date()" << endl; } void Display() { cout << _year << "-" << _month << "-" << _day << endl; } public: int _year; protected: int _month; private: int _day; }; class Time : protected Date { public: void Display() { Date::Display(); cout << _hour << "-" << _minute << "-" << _second << endl; } public: int _hour; protected: int _minute; private: int _second; }; void test3() { · Time t; 00182A9D lea ecx,[t] 00182AA0 call Time::Time (01813FCh) //通過(guò)匯編代碼看出調(diào)用了構(gòu)造函數(shù) 00182AA5 mov dword ptr [ebp-4],0 t.Display(); }
四.菱形繼承與虛繼承
從上面經(jīng)典的菱形繼承可以看出,C類(lèi)里面保存了兩份A類(lèi)的值,在空間上造成了冗余浪費(fèi),且訪問(wèn)時(shí),要顯示指定訪問(wèn)哪個(gè)父類(lèi)的成員。
class A { public: A(int data = 0) :_a(data) {} //private: int _a; }; class B1 : public A { public: B1(int data=0) :_b1(data) {} private: int _b1; }; class B2 : public A { public: B2(int data = 0) :_b2(data) {} private: int _b2; }; class C :public B1,public B2 { public: C(int data = 0) :_c(data) {} void fun() { //_a = 0; //指示不明確。 B1::_a = 1; B2::_a = 2; } private: int _c; };
虛繼承在繼承方式前加關(guān)鍵字virtual,它解決了在菱形繼承體系里面子類(lèi)對(duì)象包含多份父類(lèi)對(duì)象的數(shù)據(jù)冗余&浪費(fèi)空間的問(wèn)題。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:C++類(lèi)的繼承的基本認(rèn)識(shí)-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article28/cdhgjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、建站公司、企業(yè)網(wǎng)站制作、App設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容