6. 繼承
1 #include<iostream> 2 using namespace std; 3 4 5 class Base { 6 public: 7 Base() { 8 m_A = 10; 9 } 10 int m_A; 11 12 }; 13 14 class Son: public Base { 15 public: 16 Son() { 17 m_A = 20; 18 } 19 int m_A; 20 }; 21 22 // 對于靜態成員 23 class Base1 { 24 public: 25 26 static int m_A; 27 28 }; 29 30 int Base1::m_A = 10; 31 32 class Son1 : public Base1 { 33 public: 34 35 static int m_A; 36 }; 37 int Son1::m_A = 20; 38 39 void test01() { 40 // 1.通過物件訪問 41 Base b1; 42 Son s1; 43 cout << "通過物件訪問" << endl; 44 cout << "Base ---> m_A:" << b1.m_A << endl; 45 cout << "Son ---> m_A:" << s1.Son::m_A << endl; 46 47 48 // 2.通過類名訪問(對于靜態成員) 49 cout << "通過類名訪問" << endl; 50 cout << "Base1 ---> m_A:" << Base1::m_A << endl; 51 cout << "Son1 ---> m_A:" << Son1::Base1::m_A << endl; 52 } 53 54 int main() { 55 56 test01(); 57 58 system("pause"); 59 60 return 0; 61 } 62 63 // 總結(繼承) 64 // 繼承---目的是減少重復代碼,提高代碼的復用率 65 // 66 // 繼承語法:class 子類: 繼承方式 父類 67 // 繼承方式:公共繼承(public),保護繼承(protected),私有繼承(private) 68 // 69 // 父類中所有的非靜態成員屬性都會被子類繼承下去 70 // 父類中私有成員屬性 是被編譯器隱藏了,因此訪問不到,但是會被繼承下去 71 // 72 // cl /d1 reportSingleClassLayout(xxx類名) xxx.cpp 73 // 第一個是L,第二個是123的1,報告單各類的布局 74 // 75 // 繼承中構造和析構的順序: 76 // 先構造 父類,再構造 子類; 析構順序與構造順序相反; 77 // 78 // 繼承同名成員(變數/函式)的處理方式: 79 // 當子類與父類出現同名成員, 80 // 訪問子類同名成員 直接訪問即可 s.m_A 81 // 訪問父類同名成員 需要加作用域 s.Base::m_A 82 // 83 // 此外,對于靜態成員,處理方式與非靜態成員相同 84 // 85 // 菱形繼承 86 // 兩個派生類繼承同一個基類 87 // 又有某個類同時繼承兩個派生類 88 // 這樣的繼承成為菱形繼承,或者鉆石繼承 89 // 90 // 存在問題: 91 // 產生二義性(加作用域解決) 92 // 重復繼承,只需要一份繼承即可 93 // 利用虛繼承解決,關鍵字virtual 94 //
參考:《黑馬程式員》C++教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/469611.html
標籤:其他
上一篇:機器學習-習題(一)
