您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C++中繼承的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
繼承機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱派生類。繼承呈現了面向對象程序設計的層次結構,體現了由簡單到復雜的認知過程。以前我們接觸的復用都是函數復用,繼承是類設計層次的復用。
基類的公有成員,子類可以繼承為自己的公有成員。在派生類可以訪問,在外部也可以訪問。
基類的保護成員,子類可以繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。
基類的私有成員,子類不可以訪問基類的私有成員。
基類公有成員,子類中繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。
基類保護成員,子類中繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。
基類私有成員,子類不可以訪問基類的私有成員。
基類公有成員,子類中繼承為自己的私有成員,在派生類可以訪問,在外部不可以訪問。
基類保護成員,子類中繼承為自己的私有成員,在派生類可以訪問,在外部不可以訪問。
基類私有成員,子類不可以訪問基類的私有成員。
(1)基類private成員任何方式繼承在派生類中都是不可見的。不可見指派生類對象不能去訪問它,但是基類的私有成員還是被繼承到了派生類對象中。
(2)基類的public成員和protected成員任何繼承方式在派生類都可以訪問。
(3)基類pretected成員,派生類可以訪問,類外不能訪問。
(4)基類的其他成員在子類的訪問方式 == Min(成員在基類的訪問限定符,繼承方式)。public > protected > private。
(5)使用關鍵字class時默認的繼承方式是private,使用struct時默認的繼承方式是public,不過最好顯示的寫出繼承方式。
class Derived : public Base //指明繼承方式是public class Derived : Base //沒寫的情況下是private struct Derived : Base //沒寫的情況下是public
(6)在實際運用中一般使用都是public繼承,幾乎很少使用protetced/private繼承,實際中
擴展維護性不強。
派生類對象可以賦值給基類的對象 / 基類的指針 / 基類的引用。
基類對象不能賦值給派生類對象
基類的指針可以通過強制類型轉換賦值給派生類的指針。但是必須是基類的指針是指向派生類對象時才是安全的。
class Person //基類/父類 { protected : string _name; // 姓名 string _sex; // 性別 int _age; // 年齡 }; class Student : public Person //派生類/子類 { public : int _No ; // 學號 }; void Test () { Student sobj ; //創建子類對象sobj // 1.子類對象可以賦值給父類對象/指針/引用 Person pobj = sobj ; Person* pp = &sobj; Person& rp = sobj; //2.基類對象不能賦值給派生類對象 sobj = pobj; //錯誤 // 3.基類的指針可以通過強制類型轉換賦值給派生類的指針 pp = &sobj Student* ps1 = (Student*)pp; // 這種情況轉換時可以的。 ps1->_No = 10; pp = &pobj; Student* ps2 = (Student*)pp; // 這種情況轉換時雖然可以,但是會存在越界訪問的問題 ps2->_No = 10; }
在繼承體系中基類和派生類都有獨立的作用域。
子類和父類中有同名成員,子類成員將屏蔽父類對同名成員的直接訪問,這種情況叫隱藏,也叫重定義。(在子類成員函數中,可以使用 基類::基類成員 顯示訪問)
需要注意的是如果是成員函數的隱藏,只需要函數名相同就構成隱藏。
注意在實際中在繼承體系里面最好不要定義同名的成員。
// B中的fun和A中的fun不是構成重載,因為不是在同一作用域 // B中的fun和A中的fun構成隱藏,成員函數滿足函數名相同就構成隱藏。 class A //基類 { public: void fun() { cout << "func()" << endl; } }; class B : public A //派生類 { public: void fun(int i) { A::fun(); cout << "func(int i)->" <<i<<endl; } }; void Test() { B b; b.fun(10); };
//如果通過子類對象調用相同名稱的成員時,優先訪問子類的,基類同名的成員永遠無法通過 // 子類對象直接調用到,相當于子類同名成員將基類的同名成員隱藏了 // 如果想要同名子類對象訪問基類中同名的成員,只需在成員前加上基類名稱:: // 如果在子類成員函數中,想要訪問基類同名的成員,只需在基類成員前加上基類名稱:: class Base //基類 { public: void SetBase(int b) { _b = b; } void fun() { cout << "Base::fun()" << endl; } public: int _b; char _c; }; class Derived : public Base //派生類 { public: void SetDeirved(int b, int d) { _c = 100; Base::_c = 100; //如果在子類成員函數中,想要訪問基類同名的成員,只需在基類成員前加上基類名稱:: __super::_c = 100; SetBase(b); _d = d; } void fun(int a) { cout << "Derived::fun(int)" << endl; } public: int _d; int _c; }; int main() { Base b; b.SetBase(10); Derived d; d.SetDeirved(100, 200); /* 如果子類和基類中具有相同名稱的成員變量時,不管成員變量的類型是否相同, 都優先訪問子類的同名成員變量 不能通過子類對象直接訪問子類和父類中同名的成員變量,就相當與子類同名的成員變量將基類的同名成員變量隱藏了 */ d._c = 'A'; // d對象中有兩個_c // 有些情況下可能需要通過子類對象訪問基類中同名的成員變量 d.Base::_c = 'B'; // d.fun(); // 編譯報錯 d.fun(10); d.Base::fun(); //如果想要同名子類對象訪問基類中同名的成員,只需在成員前加上基類名稱:: return 0; }
關于“C++中繼承的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。