C++(六)——继承
生活随笔
收集整理的這篇文章主要介紹了
C++(六)——继承
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
繼承中的對象模型
#include<iostream> using namespace std; //繼承中的對象模型 class Base { public:int m_a; protected:int m_b; private:int m_c;}; class Son :public Base { public:int m_d; }; void test01() {//結(jié)果16//父類中所有非靜態(tài)成員屬性都會被子類繼承下去//私有屬性雖然無法訪問,但仍然繼承了cout << "size of Son = " << sizeof(Son) << endl; }int main() {test01();return 0; }構(gòu)造和析構(gòu)順序
#include<iostream> using namespace std; //繼承中的構(gòu)造與析構(gòu)函數(shù) 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() {//Base b;//繼承中的構(gòu)造順序,先構(gòu)造父類,再構(gòu)造子類。析構(gòu)時順序相反Son s;}int main() {test01();return 0; }同名成員處理
#include<iostream> using namespace std; class Base { public:Base() {m_a = 100;}void func() {cout << "this is Base func" << endl;}void func(int a) {cout << "this is Base func(int)" << endl;};int m_a; };class Son :public Base { public:int m_a;Son() {m_a = 200;}void func() {cout << "this is Son func" << endl;} };void test01() {Son s;cout << "Son的m_a = " << s.m_a << endl;//如果通過子類對象訪問父類中的同名成員需要加一個作用域cout << "Base的m_a = " << s.Base::m_a << endl; }void test02() {Son s;//若要訪問父類的同名成員函數(shù)也能加作用域s.Base::func(100);//如果子類中存在同名成員函數(shù),則父類同名全被隱藏,只能通過作用域訪問 }int main() {test01();test02();return 0; }同名靜態(tài)成員處理
#include <iostream> using namespace std; //繼承中的同名靜態(tài)成員處理方式 class Base { public:static int m_a;static void func() {cout << "base ——func" << endl;}static void func(int a) {cout << "base ——func(int)" << endl;}}; //類內(nèi)聲明,類外初始化 int Base::m_a = 100;class Son :public Base { public:static int m_a;static void func() {cout << "son ——func" << endl;} }; int Son::m_a = 1000; //同名靜態(tài)成員屬性 void test01() {//通過對象訪問數(shù)據(jù)Son s;cout << "Son 下m_a = " << s.m_a << endl;cout << "Base 下m_a = " << s.Base::m_a << endl;//同過類名訪問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.通過對象訪問Son s;s.func();s.Base::func();//2.通過類名訪問Son::func();Son::Base::func(1000);}int main() {//test01();test02();return 0; }繼承語法
#include<iostream> using namespace std; //class Java { //public: // void header() { // cout << "公開課,登錄注冊" << endl; // } // void footer() { // cout << "幫助中心、交流合作、站內(nèi)地圖" << endl; // // } // void left() { // cout << "java, python, c++" << endl; // // // } // void content() { // cout << "this is java" << endl; // } // //}; // //class Python { //public: // void header() { // cout << "公開課,登錄注冊" << endl; // } // void footer() { // cout << "幫助中心、交流合作、站內(nèi)地圖" << endl; // // } // void left() { // cout << "java, python, c++" << endl; // // // } // void content() { // cout << "this is Python" << endl; // } // //}; 代碼重復(fù)性太高 class BasePage { public:void header() {cout << "公開課,登錄注冊" << endl;}void footer() {cout << "幫助中心、交流合作、站內(nèi)地圖" << endl;}void left() {cout << "java, python, c++" << endl;} };//繼承的好處:減少重復(fù)的代碼 //語法:class 子類:繼承方式 父類 //子類也叫派生類 //父類也叫基類 class Java :public BasePage { public:void content() {cout << "this is Java" << endl;} };class Python :public BasePage { public:void content() {cout << "this is Python" << endl;} };void test01() {Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "--------------------------"<< endl;Python py;py.header();py.footer();py.header();py.content();cout << "--------------------------" << endl; }int main() {test01();return 0; }菱形繼承
#include<iostream> using namespace std; class Animal { public:int m_Age; }; //繼承時加上關(guān)鍵字virtual class Sheep:virtual public Animal {};class Tuo :virtual public Animal {};class Yang :public Sheep, public Tuo {}; void test01() {Yang s1;s1.Sheep::m_Age = 12;s1.Tuo::m_Age = 16;//虛繼承后相同數(shù)據(jù)是共享的//當菱形繼承時,父類有相同成員屬性時,可以添加作用域區(qū)分cout << "sheep::m_age = " << s1.Sheep::m_Age << endl;cout << "Tuo::m_age = " << s1.Tuo::m_Age << endl;//菱形繼承導(dǎo)致數(shù)據(jù)有兩份導(dǎo)致資源浪費,利用虛繼承可以解決問題 } int main() {test01();return 0; }總結(jié)
以上是生活随笔為你收集整理的C++(六)——继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++(五)——运算符重载
- 下一篇: C++(七)——多态