<C++ - 繼承02> 2018-01-24
阿新 • • 發佈:2018-01-26
情況 文件 get 形參 秘密 傳遞 輸出 輸出格式 father
01、繼承:
/* 回顧上節的內容: 1.繼承 1.1 吸收 父類成員 1.2 調整 父類成員(訪問權限 公有 私有 受保護/隱藏) 1.3增加子類的新成員 實現更多功能 2.多繼承 -->繼承所有父類所有成員 菱形繼承 -->虛繼承 virtual 今晚 補充 復習 回顧: 繼承 吸收成員 --> 對象大小 1.類中 成員變量-->對象大小只和成員變量有關 成員函數-->包含一個this指針 指向當前對象 成員 變量和函數並不在一起 static -->全局 father類的對象 -->int 如果調用成員函數 傳遞這個對象地址 給fun函數 void fun(father*this,int y); 如果能找到成員函數地址 也可以用這個方式去調用成員函數 1.成員變量 -->繼承過來 2.成員函數 -->通過傳遞父類對象的地址去調用父類的成員函數 虛繼承 -->只在孫子類中保留一份祖父的成員的拷貝 子類構造 一定會調用父類構造函數(調用無參構造) 重點: **多繼承 子類的構造要調用全部父類的構造函數 菱形繼承中 調用父類的構造函數後 還需要調用祖父類的構造函數 父類沒有寫構造 -->默認構造函數 沒有參數 類中有一個 沒有參數的構造的話 會在沒有寫構造的時候 自動調用這個函數 想要知道什麽地方需要調用構造 -->可以寫一個有參構造 看什麽地方出粗就行 父類 沒有默認構造(無參構造) 子類 必須顯性調用父類的構造函數 參數不需要統一 去掉無參構造 就只能調用有參構造 --> 什麽時候必須調用構造函數: 1.定義對象 2.函數傳遞參數(傳遞不是引用) 3.子類繼承父類的時候,調用父類的構造函數 虛繼承 -->只留一份拷貝 多繼承 不推薦使用 學習的知識 分類 整理 FBI warning 什麽 error 繼承 什麽時候調用父類的構造 warning 內存分布 protected --> 傳家寶 可以傳給兒子 private --> 私有的小秘密 可以傳 但是兒子不能訪問 繼承之後裏面的內容都會繼承過去 能不能訪問看權限(繼承過後成員屬性的表格) 如果說一些原理 想不明白 可以直接記結論 拷貝構造 -->參數必須引用 多繼承 -->虛繼承 只會留一份祖父的拷貝 重點: 調用:構造函數 調用時機 --> 繼承時候 子類必須調用父類構造函數 (一般情況 子類調用父類 父類會調用祖父類 子類不需要單獨調用祖父類) 補充 菱形繼承的時候 虛繼承 需要單獨調用祖父的構造函數 其余(不重要) 內存分布 (想要了解可以了解)不要求掌握*/ #include <iostream> using namespace std; class father // 父類 { public: int x; father(int x) :x(x){} ~father(){} void fun(int y){} }; class son :public father // 子類 { public: int y; son(int x, int y) :y(y), father(x){} // 子類的構造函數 需要調用父類的構造函數 只能寫在初始化形參列表 ~son(){} };int main() { son st(2, 3); cout << st.x << st.y << endl; cout << hex << &st.x << &st.y << endl; getchar(); return 0; } /* 繼承之後的數據部分的關系 */ struct fat { int x; }; struct so { struct fat da; int y; }; /* 虛繼承 */ /* 原有的作業上還成所有構造函數全部換成由參數的構造(選做) 輸入輸出格式 cout IO流: 1.文件操作 2.cin cout*/
02、虛繼承:
#include <iostream> using namespace std; class A { public: int x; A(int x) :x(x){} // A中的構造 private: }; class B :virtual public A { public: B(int x) :A(x){} }; class C :virtual public A { public: C(int x) :A(x){} }; class D :public B, public C { public: D(int x) :C(0), B(1), A(2){} // 子類的話 需要全部父類的構造函數 以及調用祖父類的構造 void fun() { B::x = 0x12; C::x = 0x34; // 0x34 -->52 } }; // 類的成員指針 偏移量 了解(指針大小 4個不同) int main() { int A::*p = &A::x; cout << sizeof(D) << endl; // D d(232); d.fun(); cout << d.x << endl; /*d.fun(); int *p = (int*)&d; // 強轉 cout << p[0] << ‘\t‘ << p[1] << ‘\t‘ << p[2] << ‘\t‘ << endl; */ getchar(); return 0; }
03、實例:
#include <iostream> using namespace std; class grandfather // 祖父類 { public: int x; }; class father :virtual public grandfather // 父類 { }; class mother :public grandfather { }; class son :public father, public mother { }; int main() { cout << sizeof(son) << endl; son summer; int *p = (int*)&summer; cout << &p[0] << endl; cout << hex << p[0] << endl; cout << p[2] << endl; cout << &p[2] << endl; getchar(); return 0; }
<C++ - 繼承02> 2018-01-24