【C++学习笔记二】C++继承
繼承
繼承允許我們一句另一個類來定義一個類,這使得繼承和維護一個程序變得更加容易,也達到了重用代碼功能和提高執(zhí)行效率的效果。
一般格式為:
class 派生類名 :訪問修飾符 基類名{};其中訪問修飾符是public protected private中的一個,默認(rèn)為private
派生類可以訪問基類中所有的非私有成員,因此基類成員如果不想被派生類的成員訪問,則應(yīng)該在基類聲明為private
一個派生類繼承了所有的基類非私有方法,但是下列情況除外:
- 基類的構(gòu)造函數(shù),析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)
- 基類的重載運算符
- 基類的友元函數(shù)
繼承類型
- 公有繼承:基類的公有成員也是派生類的公有成員,基類的保護成員也是派生類的保護乘員胡安,基類的私有成員不能直接被派生類訪問,但是可以通過基類的公有和保護方法來訪問。
- 保護繼承:基類的公有和保護成員將成為派生類的保護成員
- 私有繼承:公有和保護成員將稱為派生類的私有成員
多繼承
一個子類可以有多個父類,繼承了多個父類的特性,不同父類用逗號隔開。
class <派生類名>:<繼承方式><基類名>,<繼承方式>,<基類名><繼承方式><基類名>,.. {};虛繼承
因為C++多繼承的特性,當(dāng)從兩個方向繼承到同一個類的時候就可能會出現(xiàn)拷貝了兩份相同數(shù)據(jù)的問題,這個時候訪問被拷貝多份的數(shù)據(jù)成員如果沒有加名字空間編譯器就會報錯,因為不確定到底訪問的是哪一份變量。為了解決這個問題,我們要使用虛繼承從而實現(xiàn)只拷貝一份變量。需要注意的一點是,虛繼承是指對多個類繼承一個類的時候需要進行虛繼承,這樣就能解決一個類繼承這多個類的時候出現(xiàn)的成員重復(fù)。
具體見樣例:
class A{}; class B:virtual public A{}; class C:virtual public A{}; class D:public B,public C{};//注意對D來講用virtual已經(jīng)晚了,我們在上面?zhèn)€多個類繼承A的時候用虛繼承,這樣有其他類繼承B,C等的時候就不會出現(xiàn)問題。繼承機理
編譯器先通過基類的構(gòu)造函數(shù)創(chuàng)建一個基類的對象,然后再通過派生類的構(gòu)造函數(shù)在后面加上派生類的成員,并進行初始化。基類中私有成員對派生類不可見,但是派生類對象可以通過父類提供的接口對父類中的對象進行訪問。實際上派生類成員是含有基類中的所有的成員的。
對于相同名字的數(shù)據(jù)成員,通過基類方法改變的是基類的數(shù)據(jù)成員,通過派生類方法改變的是派生類數(shù)據(jù)成員。如果想要訪問基類的(公有)成員可以使用名字空間。
可以由以下測試看出:
#include<iostream> #include<cstdio>using namespace std;class A {int a[100]; public:int b; }; class B :public A {//int c[50];int d; };int main() {B a;printf("%d", sizeof(a));return 0; }運行結(jié)果:
顯然派生類中含有基類的私有成員,只是不可以直接訪問。
派生類的構(gòu)造函數(shù)
詳見另一篇文章:構(gòu)造函數(shù),作者講的很好。
在每次派生類構(gòu)造函數(shù)調(diào)用時,首先會調(diào)用父類的構(gòu)造函數(shù),然后再調(diào)用派生類的構(gòu)造函數(shù),最后先調(diào)用派生類的析構(gòu)函數(shù),最后調(diào)用父類的析構(gòu)函數(shù)。
在每個派生類構(gòu)造函數(shù)中,如果我們要使用父類的有參構(gòu)造函數(shù),則需要在函數(shù)頭部調(diào)用。如果我們沒有顯式地調(diào)用父類的構(gòu)造函數(shù)則編譯器會自動在派生類構(gòu)造函數(shù)開頭調(diào)用基類的無參構(gòu)造函數(shù)。(如果基類只有有參構(gòu)造函數(shù)編譯器會因為找不到無參構(gòu)造函數(shù)而報錯)。
顯式調(diào)用的格式如下:
class A {public:A(int x){} }; class B:public A { public: B():A(x)//只可以在這一個地方顯式調(diào)用 {} };在其他地方顯式調(diào)用都是沒有意義的。(相當(dāng)于創(chuàng)建了一個沒有辦法引用的父類)
見下例:
運行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的【C++学习笔记二】C++继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八千湘女上天山剧情介绍
- 下一篇: C++基类指针指向派生类(指针)