日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++学习笔记二】C++继承

發(fā)布時間:2023/11/30 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++学习笔记二】C++继承 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

繼承

繼承允許我們一句另一個類來定義一個類,這使得繼承和維護一個程序變得更加容易,也達到了重用代碼功能和提高執(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)建了一個沒有辦法引用的父類)
見下例:

#include<iostream> #include<cstdio>using namespace std;class A {int a[100]; public:A(){printf("調(diào)用了無參構(gòu)造函數(shù)\n");}~A(){printf("調(diào)用了析構(gòu)函數(shù)\n");}A(int x){printf("調(diào)用了有參構(gòu)造函數(shù)\n");a[0] = x;}int b; }; class B :public A {//int c[50];int d; public:B(){A(5);printf("test\n");d = 0;}void Print(){printf("Hello world!\n");} };int main() {B* a=new B();printf("%d\n", sizeof(a));a->Print();delete a;return 0; }

運行結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的【C++学习笔记二】C++继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。