標籤:fun 關係 整理 輸入 建構函式 virt 沒有 參數 error
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