這是關于一個普通雙非本科大一學生的C++的學習記錄貼
在此前,我學了一點點C語言還有簡單的數據結構,如果有小伙伴想和我一起學習的,可以私信我交流分享學習資料
那么開啟正題
今天分享的是關于繼承的知識點
1.派生類的默認成員函數
首先我們來回顧以下默認成員函數是哪幾個
1.構造函數? ? ? ? ? ? ? ? ? ? ?完成初始化工作
2.析構函數? ? ? ? ? ? ? ? ? ? ?完成清理工作
3.拷貝構造函數? ? ? ? ? ? ? 使用同類對象初始化創建新對象
4.賦值重載函數? ? ? ? ? ? ? 把一個對象賦值給另一個對象
5.取地址重載函數? ? ? ? ? ?普通對象取地址
6.const取地址重載函數? const對象取地址
那么,對于派生類,我們的默認成員函數是怎樣的呢
1.派生類的構造函數必須調用基類的構造函數初始化基類的那一部分成員,如果基類沒有默認的構造函數,則必須在派生類構造函數的初始化列表階段顯示調用
2.派生類的拷貝構造函數必須調用基類拷貝構造函數完成基類的拷貝初始化
3.派生類的operator=必須要調用基類的operator=完成基類的復制
4.派生類的析構函數會在被調用完后自動調用基類的析構函數清理基類成員,因為這樣才能保證派生類對象先清理派生類成員,再清理基類成員的順序
5.派生類對象初始化先調用基類構造,再調派生類構造(符合棧的先進后出)
6.派生類對象析構清理先調用派生路析構,再調基類析構(符合棧的先進后出)
7.因為后續一些場景析構函數需要構成重寫,重寫的條件之一是函數名相同(這個我們后面會講 解)。那么編譯器會對析構函數名進行特殊處理,處理成destrutor(),所以父類析構函數不加 virtual的情況下,子類析構函數和父類析構函數構成隱藏關系(多態內容)
class Person
{
public:Person(const char* name = "peter"): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}
protected:string _name; // 姓名
};class Student : public Person
{
public:Student(const char* name, int num): Person(name), _num(num){cout << "Student()" << endl;}Student(const Student& s): Person(s), _num(s._num){cout << "Student(const Student& s)" << endl;}Student& operator = (const Student& s){cout << "Student& operator= (const Student& s)" << endl;if (this != &s){Person::operator =(s);_num = s._num;}return *this;}~Student(){cout << "~Student()" << endl;}
protected:int _num; //學號
};void Test()
{Student s1("jack", 18);Student s2(s1);Student s3("rose", 17);s1 = s3;
}
2.繼承與友元
友元關系不能繼承,也就是說基類友元不能訪問派生類私有和保護成員
很簡單理解,這里不貼代碼了
3.繼承與靜態成員
基類定義了static靜態成員,則整個繼承體系里面只有一個這樣的成員,無論拍成出多少個子類,都只有一個static成員
class Person
{
public:static int _count;
};int Person::_count = 0;class Student : public Person
{
public:int _id;
};void Test()
{Student s1;Student s2;Student s3;cout << Person::_count << endl;s1._count = 1;cout << Person::_count << endl;s2._count = 2;cout << Person::_count << endl;s3._count = 3;cout << Person::_count << endl;
}
新手寫博客,有不對的位置希望大佬們能夠指出,也謝謝大家能看到這里,讓我們一起學習進步吧!