国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++之繼承(繼承方式+隱藏+覆蓋)

2019-11-06 07:53:44
字體:
供稿:網(wǎng)友

我們在定義對象的時候,會發(fā)現(xiàn)很多的對象之間都是有聯(lián)系的,如以下兩個類:

class Person{public: void eat(); string m_strName; int m_iAge;};class Worker{public: void eat(); void work(); string m_strName; int m_iAge; int m_iSalary;};

worker中的一些成員也是person的成員,應(yīng)對這種情況,為了減輕程序員的工作量,C++設(shè)計了繼承。 有了繼承,我們可以把worker類寫成下面那樣,不必把person類再寫一遍。其中worker是person的派生類,person是worker的 基類。

class Worker:public Person{public: void work(); int m_iSalary;};

這里有一個需要知道的,我們在實例化一個派生類的對象時,會先構(gòu)造基類,再構(gòu)造派生類,而析構(gòu)時則順序相反,具體的順序如下 person() worker() ~worker() ~person()

C++的繼承方式有3種 class A::public B//公有繼承 class A::PRotected B//保護繼承 class A::private B//私有繼承

其中protected在不涉及到繼承關(guān)系時,其特性和private的性質(zhì)是一樣的。

class Person{public: Person();//構(gòu)造函數(shù) ~Person();//析構(gòu)函數(shù) void eat(); protected: int m_iAge;private: string m_strName;};

當(dāng)做如下訪問時,會出現(xiàn)錯誤,因為賦值的不在public下

int main(){ Person person; person.eat(); person.m_iAge = 20;//錯誤 person.m_strName = "jim";//錯誤 return 0;}

當(dāng)在繼承時,做如下定義

class Person{public: Person();//構(gòu)造函數(shù) ~Person();//析構(gòu)函數(shù) void eat(); protected: int m_iAge; string m_strName;};

當(dāng)為protected時,相關(guān)的對象成員能夠繼承到如下位置。其中void work()能夠訪問繼承來的m_iAge

class Worker :public Person//公有繼承{public: Worker();//構(gòu)造 ~Worker();//析構(gòu) void eat();//繼承person的 void work(){ m_iAge = 20; }protected: string m_strName;//繼承person int m_iAge;//繼承person int m_iSalary;};

如果將以上代碼中的protected換成private,代碼如下

class Person{public: Person();//構(gòu)造函數(shù) ~Person();//析構(gòu)函數(shù) void eat(); private: int m_iAge; string m_strName;};class Worker :public Person//公有繼承{public: Worker();//構(gòu)造 ~Worker();//析構(gòu) void eat();//繼承person的 void work(){ m_iAge = 20; }//這樣訪問錯誤private: //private中的m_strName和m_iAge被繼承到了不可見位置 int m_iSalary;};

此時的void work()不可調(diào)用繼承來的m_iAge,因為private中的m_strName和m_iAge被繼承到了不可見位置。

總結(jié)一下 1.當(dāng)兩個類產(chǎn)生了繼承關(guān)系,而繼承方式是public,那么基類下的public成員會被繼承到派生類的public下面;基類下的protected成員會被繼承到派生類的protected成員下;基類的privated成員將會無法訪問。 2.當(dāng)兩個類產(chǎn)生了繼承方式,而繼承方式是protected,那么基類下的public成員會被繼承到派生類的protected下面;基類下的protected成員會被繼承到派生類的protected成員下;基類的privated成員將會無法訪問。 3.當(dāng)兩個類產(chǎn)生了繼承關(guān)系,而繼承方式是private,那么基類下的public成員會被繼承到派生類的private下面;基類下的protected成員會被繼承到派生類的private成員下;基類的privated成員將會無法訪問。

C++中有兩個很容易的混淆概念:覆蓋和隱藏。那么什么是隱藏?假如B是A的派生類,兩個類有相同函數(shù)名的成員函數(shù),比如void ABC(),這時,子類中的void ABC()會自動隱藏父類中的void ABC(),但并沒有消失,可以通過特殊的手段訪問,數(shù)據(jù)成員也有隱藏這種現(xiàn)象。那么什么是覆蓋呢?如果我們沒有在子類中定義同名的虛函數(shù),那么在子類虛函數(shù)表當(dāng)中就會寫上父類當(dāng)中那個虛函數(shù)的函數(shù)入口地址,如果我們在子類中也定義了同名的虛函數(shù),那么在子類的虛函數(shù)表當(dāng)中,我們就會把原來父類的虛函數(shù)的函數(shù)地址覆蓋一下,覆蓋成子類的虛函數(shù)的函數(shù)地址【關(guān)于虛函數(shù)表涉及請看多態(tài)的實現(xiàn)原理篇】


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 门源| 淳化县| 原阳县| 永福县| 喜德县| 桐城市| 贡嘎县| 洛宁县| 湟中县| 绍兴市| 洪洞县| 青州市| 永仁县| 景宁| 贵州省| 务川| 莎车县| 合阳县| 蕲春县| 南平市| 乌兰县| 宁安市| 涞水县| 神池县| 大足县| 无为县| 改则县| 溧阳市| 遂溪县| 苗栗市| 乐清市| 信宜市| 义马市| 邵阳市| 麻阳| 新乡县| 南岸区| 望奎县| 古田县| 涟源市| 涿州市|