這是關于一個普通雙非本科大一學生的C++的學習記錄貼
在此前,我學了一點點C語言還有簡單的數據結構,如果有小伙伴想和我一起學習的,可以私信我交流分享學習資料
那么開啟正題
今天分享的是關于繼承的知識點
1.繼承的概念及定義
1.1繼承的概念
繼承機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生的新的類叫做派生類。繼承呈現了面向對象程序組設計的層次結構,體現了由簡單到復雜的認識過程。以前我們接觸到的復用都是函數復用,繼承是類設計層次的復用
1.2繼承的定義
1.2.1定義格式
我們來看下面的代碼
class Person
{
public:int _age;
};class Student : public Person
{
public:int _stuid;
};
這段代碼中Student就是派生類(子類),public就是繼承方式,Person就是基類(父類)
1.2.2繼承關系和訪問限定符
在學習封裝時候我們了解到訪問限定符有三種
public訪問,protected訪問,private訪問
與此對應的,繼承方式也有三種
public繼承,protected訪問,private訪問
1.2.3繼承父類成員訪問方式的變化
以前我們說protected(保護)和private(私有)暫時沒有區別,而在繼承這里就體現出來了區別
在public繼承下,子類中,父類的private成員是無法訪問的,而protected成員是可以訪問的
不同的繼承方式與不同的訪問限定符,會是子類對父類的訪問不一樣,下面我們給出規律
父類的private成員在子類中無論以任何方式繼承都是無法訪問的
對于其他的,我們有下面的公式
父類成員在子類中的訪問方式 == Min(成員在父類中的訪問限定符,繼承方式)
(public < protected < private)
注意:
1.?使用關鍵字class時默認繼承方式是private,使用struct時默認繼承方式時public,不過最好顯式給出繼承方式
2.實際運用中一般都是public繼承,幾乎很少有其他兩種繼承出現,我們也不提倡(維護性不強)
2.父類和子類對象賦值轉換
1.子類對象可以賦值給父類的對象 / 父類的指針 / 父類的引用。(我們叫切割或者切片)
2.父類對象不能賦值給子類對象
class Person
{
protected:int _age = 10;
};class Student : public Person
{
public:int _stuid;
};void Test1()
{Student s;// 1.子類對象可以賦值給父類的對象 / 父類的指針 / 父類的引用。// (我們叫切割或者切片)Person p = s;Person* pp = &s;Person& rp = s;// 2.父類對象不能賦值給子類對象s = p;(err)
}
3.繼承中的作用域
1.在繼承體系中父類和子類都有獨自的作用域
2.父類和子類有同名成員,子類成員將屏蔽父類對同名成員的直接訪問,這種情況叫做隱藏(也叫做重定義)
3.如果是成員函數的隱藏,只要是函數名相同就構成隱藏
4.實際中繼承體系里,最好不要定義同名成員
class A
{
public:void Func(int i = 10){cout << "A::Func(int)" << endl;}void Func(char ch = 'a'){cout << "A::Func(char)" << endl;}
};class B : public A
{
public:void Func(int i){cout << "B::Func()" << endl;}
};void Test2()
{A a;B b;a.Func(1);a.Func('a');b.Func(1);
}
?上面的幾個Func分別構成重構和隱藏
?新手寫博客,有不對的位置希望大佬們能夠指出,也謝謝大家能看到這里,讓我們一起學習進步吧!