1、基本語法
#include <iostream> using namespace std; #include <string> //普通實現(xiàn)頁面 //Java頁面 //class Java { //public: // void header() { // cout << "首頁、公開課、登錄、注冊...(公共頭部)" << endl; // } // void footer() { // cout << "幫助中心、交流合作、站內(nèi)地圖...(公共底部)" << endl; // } // void left() { // cout << "Java、python、c++...(公共分類列表)" << endl; // } // void content() { // cout << "Java學(xué)科視頻" << endl; // } //}; // // Python頁面 //class Python { //public: // void header() { // cout << "首頁、公開課、登錄、注冊...(公共頭部)" << endl; // } // void footer() { // cout << "幫助中心、交流合作、站內(nèi)地圖...(公共底部)" << endl; // } // void left() { // cout << "Java、python、c++...(公共分類列表)" << endl; // } // void content() { // cout << "Python學(xué)科視頻" << endl; // } //}; // C++頁面 //class CPP { //public: // void header() { // cout << "首頁、公開課、登錄、注冊...(公共頭部)" << endl; // } // void footer() { // cout << "幫助中心、交流合作、站內(nèi)地圖...(公共底部)" << endl; // } // void left() { // cout << "Java、python、c++...(公共分類列表)" << endl; // } // void content() { // cout << "C++學(xué)科視頻" << endl; // } //}; //繼承實現(xiàn)頁面 //公共頁面 class BasePage { public: void header() { cout << "首頁、公開課、登錄、注冊...(公共頭部)" << endl; } void footer() { cout << "幫助中心、交流合作、站內(nèi)地圖...(公共底部)" << endl; } void left() { cout << "Java、python、c++...(公共分類列表)" << endl; } }; //Java頁面 class Java :public BasePage { public: void content() { cout << "Java學(xué)科視頻" << endl; } }; //Python頁面 class Python :public BasePage { public: void content() { cout << "Python學(xué)科視頻" << endl; } }; //C++頁面 class CPP :public BasePage { public: void content() { cout << "C++學(xué)科視頻" << endl; } }; void test01() { cout << "Java下載視頻頁面如下:" << endl; Java ja; ja.header(); ja.footer(); ja.left(); ja.content(); cout << "---------------------------" << endl; cout << "Python下載視頻頁面如下:" << endl; Python py; py.header(); py.footer(); py.left(); py.content(); cout << "---------------------------" << endl; cout << "C++下載視頻頁面如下:" << endl; CPP cpp; cpp.header(); cpp.footer(); cpp.left(); cpp.content(); } int main() { test01(); system("pause"); return 0; }
2、繼承方式
繼承方式一共有三種:
- 公共繼承
- 保護繼承
- 私有繼承
#include <iostream> using namespace std; #include <string> //公共繼承 class Base1 { public: int m_A; protected: int m_B; private: int m_C; }; class Son1 :public Base1 { void func() { m_A = 10;//父類中的公共權(quán)限成員 到子類中依然是公共權(quán)限 m_B = 10;//父類中的保護權(quán)限成員 到子類中依然是保護權(quán)限 //m_C = 10;//父類中的私有權(quán)限成員 子類訪問不到 } }; void test01() { Son1 s1; s1.m_A = 100; //s1.m_B = 100;//到son1中 m_B是保護權(quán)限 類外訪問不到 } //保護繼承 class Base2 { public: int m_A; protected: int m_B; private: int m_C; }; class Son2 :protected Base2 { public: void func() { m_A = 10;//父類中的公共權(quán)限成員 到子類中是保護權(quán)限 m_B = 10;//父類中的保護權(quán)限成員 到子類中依然是保護權(quán)限 //m_C = 10;//父類中的私有權(quán)限成員 子類訪問不到 } }; void test02() { Son2 s1; //s1.m_A = 1000;//在son2中 m_A變?yōu)楸Wo權(quán)限 因此類外訪問不到 //s1.m_B = 1000;//在son2中 m_B保護權(quán)限 不可以訪問 } //私有繼承 class Base3 { public: int m_A; protected: int m_B; private: int m_C; }; class Son3 :private Base2 { public: void func() { m_A = 10;//父類中的公共權(quán)限成員 到子類中是私有權(quán)限 m_B = 10;//父類中的保護權(quán)限成員 到子類中是私有權(quán)限 //m_C = 10;//父類中的私有權(quán)限成員 子類訪問不到 } }; class GrandSon3 :public Son3 { public: void func() { //m_A = 1000;//到了son3中 m_A變?yōu)樗接?即使是兒子 也訪問不到 //m_B = 1000;//到了son3中 m_B變?yōu)樗接?即使是兒子 也訪問不到 } }; void test03() { Son3 s1; //s1.m_A = 1000;//在son3中 m_A變?yōu)樗接袡?quán)限 因此類外訪問不到 //s1.m_B = 1000;//在son3中 m_B私有權(quán)限 不可以訪問 } int main() { system("pause"); return 0; }
3、繼承中的對象模型
#include <iostream> using namespace std; #include <string> class Base { public: int m_A; protected: int m_B; private: int m_C; }; class Son :public Base { public: int m_D; }; //利用開發(fā)人員命令提示符工具查看對象模型 //跳轉(zhuǎn)盤符 F: //跳轉(zhuǎn)文件路徑 cd 具體路徑下 //查看命令 // cl /d1 reportSingleClassLayout類名 文件名 void test01() { //16 //父類中所有非靜態(tài)成員屬性都會被子類繼承下去 //父類中私有成員屬性 是被編譯器給隱藏了 因此是訪問不到,但是缺省被繼承下去了 cout << "size of Son = " << sizeof(Son) << endl; } int main() { system("pause"); return 0; }
4、繼承中構(gòu)造和析構(gòu)順序
#include <iostream> using namespace std; #include <string> //繼承中的構(gòu)造和析構(gòu)順序 class Base { public: Base() { cout << "Base的構(gòu)造函數(shù)" << endl; } ~Base() { cout << "Base的析構(gòu)函數(shù)" << endl; } }; class Son :public Base { public: Son() { cout << "Son的構(gòu)造函數(shù)" << endl; } ~Son() { cout << "Son的析構(gòu)函數(shù)" << endl; } }; void test01() { //繼承的構(gòu)造和析構(gòu)順序如下: //先構(gòu)造父類 再構(gòu)造子類,析構(gòu)的順序與構(gòu)造的順序相反 Son s; } int main() { test01(); system("pause"); return 0; }
5、同名成員處理
#include <iostream> using namespace std; #include <string> class Base { public: Base() { m_A = 100; } void func() { cout << "Base - func()調(diào)用" << endl; } void func(int a) { cout << "Base - func(int a)調(diào)用" << endl; } int m_A; }; class Son :public Base { public: Son() { m_A = 200; } void func() { cout << "Son - func()調(diào)用" << endl; } int m_A; }; //同名成員屬性 void test01() { Son s; cout << "Son 下m_A = " << s.m_A << endl; //如果通過子類對象 訪問到父類中同名成員 需要加作用域 cout << "Base 下m_A = " << s.Base::m_A << endl; } //同名成員函數(shù)處理 void test02() { Son s; s.func();//直接調(diào)用 調(diào)用是子類中的同名成員 s.Base::func();//調(diào)用父類的 //如果子類中出現(xiàn)和父類同名的成員函數(shù),子類的同名成員會隱藏掉父類中所有同名的成員函數(shù) //如果想訪問到父類中被隱藏的同名成員函數(shù),需要加作用域 //s.func(100); 錯誤 s.Base::func(100); } int main() { //test01(); test02(); system("pause"); return 0; }
6、同名靜態(tài)成員處理方法
#include <iostream> using namespace std; #include <string> class Base { public: static int m_A; static void func() { cout << "Base - static void func()" << endl; } }; int Base::m_A=100; class Son :public Base { public: static int m_A; static void func() { cout << "Son - static void func()" << endl; } }; int Son::m_A = 200; //同名靜態(tài)成員屬性 void test01() { //1、通過對象訪問 cout << "通過對象訪問:" << endl; Son s; cout << " Son 下m_A = " << s.m_A << endl; cout << "Base 下m_A = " << s.Base::m_A << endl; //2、通過類名訪問 cout << "通過類名訪問:" << endl; cout << "Son 下m_A = " << Son::m_A << endl; //第一個:代表通過類名方式訪問 第二個:代表訪問父類作用域下 cout << "Base 下m_A = " << Son::Base::m_A << endl; } //同名靜態(tài)成員函數(shù) void test02() { //1、通過對象訪問 cout << "通過對象訪問:" << endl; Son s; s.func(); s.Base::func(); //2、通過類名訪問 cout << "通過類名訪問:" << endl; Son::func(); Son::Base::func(); } int main() { //test01(); test02(); system("pause"); return 0; }
7、多繼承語法
#include <iostream> using namespace std; #include <string> class Base1 { public: Base1() { m_A = 100; } int m_A; }; class Base2{ public: Base2() { m_A = 200; } int m_A; }; //子類 需要繼承Base1 和Base2 class Son :public Base1, public Base2 { public: Son() { m_C = 300; m_D = 400; } int m_C; int m_D; }; void test01() { Son s; cout << "sizeof Son = " << sizeof(s) << endl; //當(dāng)父類中出現(xiàn)同名成員,需要加作用域區(qū)分 cout << "Base1::m_A = " << s.Base1::m_A << endl; cout << "Base2::m_A = " << s.Base2::m_A << endl; } int main() { test01(); system("pause"); return 0; }
8、菱形繼承
菱形繼承概念:
兩個派生類繼承同一個基類又有某個類同時繼承者兩個派生類
這種繼承被稱為菱形繼承,或者鉆石繼承文章來源:http://www.zghlxwxcb.cn/news/detail-696322.html
#include <iostream> using namespace std; #include <string> //動物類 class Animal { public: int m_Age; }; //利用虛繼承 解決菱形繼承的問題 //繼承之前 加上關(guān)鍵字 virtual 變?yōu)樘摾^承 // Animal類稱為 虛基類 //羊類 class Sheep :virtual public Animal { }; //駝類 class Tuo :virtual public Animal { }; //羊駝類 class SheepTuo :public Sheep, public Tuo { }; void test01() { SheepTuo st; st.Sheep::m_Age = 18; st.Tuo::m_Age = 28; //當(dāng)菱形繼承,兩個父類擁有相同數(shù)據(jù),需要加以作用域區(qū)分 cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl; cout << "st.Tuo::m_Age =" << st.Tuo::m_Age << endl; cout << "st.m_Age = " << st.m_Age << endl; //這份數(shù)據(jù)我們知道 只要有一份就可以,菱形繼承導(dǎo)致數(shù)據(jù)有兩份,資源浪費 } int main() { test01(); system("pause"); return 0; }
文章來源地址http://www.zghlxwxcb.cn/news/detail-696322.html
到了這里,關(guān)于繼承(個人學(xué)習(xí)筆記黑馬學(xué)習(xí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!