二十万字C/C++、嵌入式软开面试题全集宝典三
?
目錄
1、 構(gòu)造函數(shù)析構(gòu)函數(shù)可否拋出異常
2、 類如何實(shí)現(xiàn)只能靜態(tài)分配和只能動(dòng)態(tài)分配
3、 如果想將某個(gè)類用作基類,為什么該類必須定義而非聲明?
4、 什么情況會(huì)自動(dòng)生成默認(rèn)構(gòu)造函數(shù)?
5、 構(gòu)造函數(shù)的擴(kuò)展過(guò)程?
6、 程序員定義的析構(gòu)函數(shù)被擴(kuò)展的過(guò)程?
7、 構(gòu)造函數(shù)的執(zhí)行算法?
8、 哪些函數(shù)不能是虛函數(shù)
9、 虛函數(shù)的調(diào)用機(jī)制
10、 什么是類的繼承?
11、 什么是多繼承
12、 什么是組合?
13、 抽象基類為什么不能創(chuàng)建對(duì)象?
14、 純虛函數(shù)定義
15、 虛函數(shù)與純虛函數(shù)的區(qū)別在于
16、 類什么時(shí)候會(huì)析構(gòu)?
17、 為什么友元函數(shù)必須在類內(nèi)部聲明?
18、 C++ ?向?qū)ο蟮娜?特征是:封裝、繼承、多態(tài)。
19、 介紹一下C++里面的多態(tài)?
20、 C++ 中重載和重寫,重定義的區(qū)別
?
1、 構(gòu)造函數(shù)析構(gòu)函數(shù)可否拋出異常
1.C++只會(huì)析構(gòu)已經(jīng)完成的對(duì)象,對(duì)象只有在其構(gòu)造函數(shù)執(zhí)行完畢才算是完全構(gòu)造妥當(dāng)。在構(gòu)造函數(shù)中發(fā)生異常,控制權(quán)轉(zhuǎn)出構(gòu)造函數(shù)之外。因此,在對(duì)象b的構(gòu)造函數(shù)中發(fā)生異常,對(duì)象b的析構(gòu)函數(shù)不會(huì)被調(diào)用。因此會(huì)造成內(nèi)存泄漏。
2.用auto_ptr對(duì)象來(lái)取代指針類成員,便對(duì)構(gòu)造函數(shù)做了強(qiáng)化,免除了拋出異常時(shí)發(fā)生資源泄漏的危機(jī),不再需要在析構(gòu)函數(shù)中手動(dòng)釋放資源;
3.如果控制權(quán)基于異常的因素離開析構(gòu)函數(shù),而此時(shí)正有另一個(gè)異常處于作用狀態(tài),C++會(huì)調(diào)用terminate函數(shù)讓程序結(jié)束;
4.如果異常從析構(gòu)函數(shù)拋出,而且沒有在當(dāng)?shù)剡M(jìn)行捕捉,那個(gè)析構(gòu)函數(shù)便是執(zhí)行不全的。如果析構(gòu)函數(shù)執(zhí)行不全,就是沒有完成他應(yīng)該執(zhí)行的每一件事情。
2、 類如何實(shí)現(xiàn)只能靜態(tài)分配和只能動(dòng)態(tài)分配
1.前者是把new、delete運(yùn)算符重載為private屬性;后者是把構(gòu)造、析構(gòu)函數(shù)設(shè)為protected屬性,再用子類來(lái)動(dòng)態(tài)創(chuàng)建;
2.建立類的對(duì)象有兩種方式:
1靜態(tài)建立,靜態(tài)建立一個(gè)類對(duì)象,就是由編譯器為對(duì)象在棧空間中分配內(nèi)存;
2動(dòng)態(tài)建立,A *p = new A();動(dòng)態(tài)建立一個(gè)類對(duì)象,就是使用new運(yùn)算符為對(duì)象在堆空間中分配內(nèi)存。這個(gè)過(guò)程分為兩步,第一步執(zhí)行operator new()函數(shù),在堆中搜索一塊內(nèi)存并進(jìn)行分配;第二步調(diào)用類構(gòu)造函數(shù)構(gòu)造對(duì)象;
3.只有使用new運(yùn)算符,對(duì)象才會(huì)被建立在堆上,因此只要限制new運(yùn)算符就可以實(shí)現(xiàn)類對(duì)象只能建立在棧上。可以將new運(yùn)算符設(shè)為私有。
3、 如果想將某個(gè)類用作基類,為什么該類必須定義而非聲明?
派生類中包含并且可以使用它從基類繼承而來(lái)的成員,為了使用這些成員,派生類必須知道他們是什么。
4、 什么情況會(huì)自動(dòng)生成默認(rèn)構(gòu)造函數(shù)?
1.帶有默認(rèn)構(gòu)造函數(shù)的類成員對(duì)象,如果一個(gè)類沒有任何構(gòu)造函數(shù),但它含有一個(gè)成員對(duì)象(另一個(gè)類的對(duì)象是這個(gè)類的成員),而后者有默認(rèn)構(gòu)造函數(shù),那么編譯器就為該類合成出一個(gè)默認(rèn)構(gòu)造函數(shù)。不過(guò)這個(gè)合成操作只有在構(gòu)造函數(shù)真正被需要的時(shí)候才會(huì)發(fā)生;如果一個(gè)類A含有多個(gè)成員類對(duì)象的話,那么類A的每一個(gè)構(gòu)造函數(shù)必須調(diào)用每一個(gè)成員對(duì)象的默認(rèn)構(gòu)造函數(shù)而且必須按照類對(duì)象在類A中的聲明順序進(jìn)行;
2.帶有默認(rèn)構(gòu)造函數(shù)的基類,如果一個(gè)沒有任何構(gòu)造函數(shù)的派生類派生自一個(gè)帶有默認(rèn)構(gòu)造函數(shù)基類,那么該派生類會(huì)合成一個(gè)構(gòu)造函數(shù)調(diào)用上一層基類的默認(rèn)構(gòu)造函數(shù);
3.帶有一個(gè)虛函數(shù)的類
4.帶有一個(gè)虛基類的類
5.合成的默認(rèn)構(gòu)造函數(shù)中,只有基類子對(duì)象和成員類對(duì)象會(huì)被初始化。所有其他的非靜態(tài)數(shù)據(jù)成員都不會(huì)被初始化。
5、 構(gòu)造函數(shù)的擴(kuò)展過(guò)程?
1.記錄在成員初始化列表中的數(shù)據(jù)成員初始化操作會(huì)被放在構(gòu)造函數(shù)的函數(shù)體內(nèi),并與成員的聲明順序?yàn)轫樞?#xff1b;
2.如果一個(gè)成員并沒有出現(xiàn)在成員初始化列表中,但它有一個(gè)默認(rèn)構(gòu)造函數(shù),那么默認(rèn)構(gòu)造函數(shù)必須被調(diào)用;
3.如果class有虛表,那么它必須被設(shè)定初值;
4.所有上一層的基類構(gòu)造函數(shù)必須被調(diào)用;
5.所有虛基類的構(gòu)造函數(shù)必須被調(diào)用。
6、 程序員定義的析構(gòu)函數(shù)被擴(kuò)展的過(guò)程?
1.析構(gòu)函數(shù)函數(shù)體被執(zhí)行;
2.如果class擁有成員類對(duì)象,而后者擁有析構(gòu)函數(shù),那么它們會(huì)以其聲明順序的相反順序被調(diào)用;
3.如果對(duì)象有一個(gè)vptr,現(xiàn)在被重新定義
4.如果有任何直接的上一層非虛基類擁有析構(gòu)函數(shù),則它們會(huì)以聲明順序被調(diào)用;
5.如果任何虛基類擁有析構(gòu)函數(shù)
7、 構(gòu)造函數(shù)的執(zhí)行算法?
1.在派生類構(gòu)造函數(shù)中,所有的虛基類及上一層基類的構(gòu)造函數(shù)調(diào)用;
2.對(duì)象的vptr被初始化;
3.如果有成員初始化列表,將在構(gòu)造函數(shù)體內(nèi)擴(kuò)展開來(lái),這必須在vptr被設(shè)定之后才做;
4.執(zhí)行程序員所提供的代碼;
8、 哪些函數(shù)不能是虛函數(shù)
1.構(gòu)造函數(shù),構(gòu)造函數(shù)初始化對(duì)象,派生類必須知道基類函數(shù)干了什么,才能進(jìn)行構(gòu)造;當(dāng)有虛函數(shù)時(shí),每一個(gè)類有一個(gè)虛表,每一個(gè)對(duì)象有一個(gè)虛表指針,虛表指針在構(gòu)造函數(shù)中初始化;
2.內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)表示在編譯階段進(jìn)行函數(shù)體的替換操作,而虛函數(shù)意味著在運(yùn)行期間進(jìn)行類型確定,所以內(nèi)聯(lián)函數(shù)不能是虛函數(shù);
3.靜態(tài)函數(shù),靜態(tài)函數(shù)不屬于對(duì)象屬于類,靜態(tài)成員函數(shù)沒有this指針,因此靜態(tài)函數(shù)設(shè)置為虛函數(shù)沒有任何意義。
4.友元函數(shù),友元函數(shù)不屬于類的成員函數(shù),不能被繼承。對(duì)于沒有繼承特性的函數(shù)沒有虛函數(shù)的說(shuō)法。
5.普通函數(shù),普通函數(shù)不屬于類的成員函數(shù),不具有繼承特性,因此普通函數(shù)沒有虛函數(shù)。
9、 虛函數(shù)的調(diào)用機(jī)制
1.分為靜態(tài)綁定(編譯時(shí)綁定),動(dòng)態(tài)綁定(運(yùn)行時(shí)綁定);
當(dāng)某個(gè)虛函數(shù)通過(guò)指針或是引用調(diào)用時(shí)就會(huì)發(fā)生動(dòng)態(tài)綁定,具體調(diào)用的函數(shù)與對(duì)象的動(dòng)態(tài)類型相匹配,當(dāng)一個(gè)基類指針指向派生類時(shí),調(diào)用的函數(shù)是派生類的函數(shù)。
2.由于繼承導(dǎo)致對(duì)象的指針和引用有兩種不同的狀態(tài),一個(gè)是靜態(tài)類型,一個(gè)是動(dòng)態(tài)類型。
靜態(tài)類型:指針和引用聲明時(shí)的類型
動(dòng)態(tài)類型:指針和引用實(shí)際指向的類型。
10、 什么是類的繼承?
1.類與類之間的關(guān)系
has-A包含關(guān)系,即成員對(duì)象。用以描述一個(gè)類由多個(gè)部件類構(gòu)成,實(shí)現(xiàn)has-A關(guān)系用類的成員屬性表示,即一個(gè)類的成員屬性是另一個(gè)已經(jīng)定義好的類;
use-A,一個(gè)類使用另一個(gè)類,通過(guò)類之間的成員函數(shù)相互聯(lián)系,定義友元或者通過(guò)傳遞參數(shù)的方式來(lái)實(shí)現(xiàn);
is-A,繼承關(guān)系,關(guān)系具有傳遞性;
2.繼承的相關(guān)概念
所謂的繼承就是一個(gè)類繼承了另一個(gè)類的屬性和方法,這個(gè)新的類包含了上一個(gè)類的屬性和方法,被稱為子類或者派生類,被繼承的類稱為父類或者基類;
3.繼承的特點(diǎn)
子類擁有父類的所有屬性和方法,子類可以擁有父類沒有的屬性和方法,子類對(duì)象可以當(dāng)做父類對(duì)象使用;
4.繼承中的訪問(wèn)控制
public、protected、private
5.繼承中的構(gòu)造和析構(gòu)函數(shù)
繼承中的構(gòu)造:
1子類對(duì)象在創(chuàng)建之時(shí)會(huì)首先調(diào)用父類的構(gòu)造函數(shù)
2先執(zhí)行父類的構(gòu)造函數(shù)再執(zhí)行子類的構(gòu)造函數(shù)
3父類的構(gòu)造函數(shù)可以被隱式調(diào)用或者顯式調(diào)用
繼承中的析構(gòu):
1執(zhí)行自身的析構(gòu)函數(shù)
2執(zhí)行成員變量的析構(gòu)函數(shù)
3執(zhí)行父類的析構(gòu)函數(shù)
6.繼承中的兼容性原則
凡是基類能解決的問(wèn)題,公有派生類都可以解決:
1子類對(duì)象可以當(dāng)作父類對(duì)象使用
2子類對(duì)象可以直接賦值給父類對(duì)象
3子類對(duì)象可以直接初始化父類對(duì)象
4父類指針可以直接指向子類對(duì)象
5父類引用可以直接引用子類對(duì)象
在替代之后,派生類對(duì)象就可以作為基類的對(duì)象使用,但是只能使用從基類繼承的成員。
11、 什么是多繼承
多繼承即一個(gè)子類可以有多個(gè)父類,它繼承了多個(gè)父類的特性。
12、 什么是組合?
1.一個(gè)類里面的數(shù)據(jù)成員是另一個(gè)類的對(duì)象,即內(nèi)嵌其他類的對(duì)象作為自己的成員;創(chuàng)建組合類的對(duì)象:首先創(chuàng)建各個(gè)內(nèi)嵌對(duì)象,難點(diǎn)在于構(gòu)造函數(shù)的設(shè)計(jì)。創(chuàng)建對(duì)象時(shí)既要對(duì)基本類型的成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象進(jìn)行初始化。
2.創(chuàng)建組合類對(duì)象,構(gòu)造函數(shù)的執(zhí)行順序:先調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù),然后按照內(nèi)嵌對(duì)象成員在組合類中的定義順序,與組合類構(gòu)造函數(shù)的初始化列表順序無(wú)關(guān)。然后執(zhí)行組合類構(gòu)造函數(shù)的函數(shù)體,析構(gòu)函數(shù)調(diào)用順序相反。
13、 抽象基類為什么不能創(chuàng)建對(duì)象?
抽象類是一種特殊的類,它是為了抽象和設(shè)計(jì)的目的建立的,它處于繼承層次結(jié)構(gòu)的較上層。
(1)抽象類的定義:稱帶有純虛函數(shù)的類為抽象類。
(2)抽象類的作用:抽象類的主要作用是將有關(guān)的操作作為結(jié)果接口組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為派生類提供一個(gè)公共的根,派生類將具體實(shí)現(xiàn)在其基類中作為接口的操作。所以派生類實(shí)際上刻畫了一組子類的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類,子類可以具體實(shí)現(xiàn)這些語(yǔ)義,也可以再將這些語(yǔ)義傳給自己的子類。
(3)使用抽象類時(shí)注意:抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類中沒有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體的類。
抽象類是不能定義對(duì)象的。一個(gè)純虛函數(shù)不需要(但是可以)被定義。
14、 純虛函數(shù)定義
一、定義
純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:
class <類名>{virtual <類型><函數(shù)名>(<參數(shù)表>)=0;…};
1.在許多情況下,在基類中不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),而把它聲明為純虛函數(shù),它的實(shí)現(xiàn)留給該基類的派生類去做。這就是純虛函數(shù)的作用。
2.純虛函數(shù)可以讓類先具有一個(gè)操作名稱,而沒有操作內(nèi)容,讓派生類在繼承時(shí)再去具體地給出定義。凡是含有純虛函數(shù)的類叫做抽象類。這種類不能聲明對(duì)象,只是作為基類為派生類服務(wù)。除非在派生類中完全實(shí)現(xiàn)基類中所有的純虛函數(shù),否則,派生類也變成了抽象類,不能實(shí)例化對(duì)象。
二、純虛函數(shù)引入原因
1、為了方便使用多態(tài)特性,我們常常需要在基類中定義虛擬函數(shù)。
2、在很多情況下,基類本身生成對(duì)象是不合情理的。例如,動(dòng)物作為一個(gè)基類可以派生出老虎、孔雀等子類,但動(dòng)物本身生成對(duì)象明顯不合常理。為了解決上述問(wèn)題,引入了純虛函數(shù)的概念,將函數(shù)定義為純虛函數(shù)(方法:virtual ReturnType Function()= 0;)。若要使派生類為非抽象類,則編譯器要求在派生類中,必須對(duì)純虛函數(shù)予以重載以實(shí)現(xiàn)多態(tài)性。同時(shí)含有純虛函數(shù)的類稱為抽象類,它不能生成對(duì)象。這樣就很好地解決了上述兩個(gè)問(wèn)題。例如,繪畫程序中,shape作為一個(gè)基類可以派生出圓形、矩形、正方形、梯形等,如果我要求面積總和的話,那么會(huì)可以使用一個(gè) shape * 的數(shù)組,只要依次調(diào)用派生類的area()函數(shù)了。如果不用接口就沒法定義成數(shù)組,因?yàn)榧瓤梢允莄ircle ,也可以是square ,而且以后還可能加上rectangle,等等.
三、相似概念
1、多態(tài)性
指相同對(duì)象收到不同消息或不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的實(shí)現(xiàn)動(dòng)作。C++支持兩種多態(tài)性:編譯時(shí)多態(tài)性,運(yùn)行時(shí)多態(tài)性。
a.編譯時(shí)多態(tài)性:通過(guò)重載函數(shù)實(shí)現(xiàn)
b.運(yùn)行時(shí)多態(tài)性:通過(guò)虛函數(shù)實(shí)現(xiàn)。
2、虛函數(shù)
虛函數(shù)是在基類中被聲明為virtual,并在派生類中重新定義的成員函數(shù),可實(shí)現(xiàn)成員函數(shù)的動(dòng)態(tài)重載。
3、抽象類
包含純虛函數(shù)的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數(shù),所以不能定義抽象類的對(duì)象。
15、 虛函數(shù)與純虛函數(shù)的區(qū)別在于
1.純虛函數(shù)只有定義沒有實(shí)現(xiàn),虛函數(shù)既有定義又有實(shí)現(xiàn);
2.含有純虛函數(shù)的類不能定義對(duì)象,含有虛函數(shù)的類能定義對(duì)象;
16、 類什么時(shí)候會(huì)析構(gòu)?
1.對(duì)象生命周期結(jié)束,被銷毀時(shí);
2.delete指向?qū)ο蟮闹羔槙r(shí),或delete指向?qū)ο蟮幕愵愋椭羔?#xff0c;而其基類虛構(gòu)函數(shù)是虛函數(shù)時(shí);
3.對(duì)象i是對(duì)象o的成員,o的析構(gòu)函數(shù)被調(diào)用時(shí),對(duì)象i的析構(gòu)函數(shù)也被調(diào)用。
17、 為什么友元函數(shù)必須在類內(nèi)部聲明?
因?yàn)榫幾g器必須能夠讀取這個(gè)結(jié)構(gòu)的聲明以理解這個(gè)數(shù)據(jù)類型的大小、行為等方面的所有規(guī)則。有一條規(guī)則在任何關(guān)系中都很重要,那就是誰(shuí)可以訪問(wèn)我的私有部分。
18、 C++ ?向?qū)ο蟮娜?特征是:封裝、繼承、多態(tài)。
1、所謂封裝
就是把客觀事物封裝成抽象的類,并且類可以把??的數(shù)據(jù)和?法只讓信任的類或者對(duì)象操作,對(duì)不可信的進(jìn)?信息隱藏。
?個(gè)類就是?個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在?個(gè)對(duì)象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問(wèn)。通過(guò)這種?式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防?程序中?關(guān)的部分意外的改變或錯(cuò)誤的使?了對(duì)象的私有部分。
2、所謂繼承
是指可以讓某個(gè)類型的對(duì)象獲得另?個(gè)類型的對(duì)象的屬性的?法。它?持按級(jí)分類的概念。繼承是指這樣?種能?:它可以使?現(xiàn)有類的所有功能,并在?需重新編寫原來(lái)的類的情況下對(duì)這些功能進(jìn)?擴(kuò)展。通過(guò)繼承創(chuàng)建的新類稱為“?類”或者“派?類”,被繼承的類稱為“基類”、“?類”或“超類”。繼承的過(guò)程,就是從?般到特殊的過(guò)程。要實(shí)現(xiàn)繼承,可以通過(guò)“繼承”和“組合”來(lái)實(shí)現(xiàn)。
繼承概念的實(shí)現(xiàn)?式有兩類:
實(shí)現(xiàn)繼承:實(shí)現(xiàn)繼承是指直接使?基類的屬性和?法??需額外編碼的能?。
接?繼承:接?繼承是指僅使?屬性和?法的名稱、但是?類必需提供實(shí)現(xiàn)的能?。
3、所謂多態(tài)
就是向不同的對(duì)象發(fā)送同?個(gè)消息,不同對(duì)象在接收時(shí)會(huì)產(chǎn)?不同的?為(即?法)。即?個(gè)接?,可以實(shí)現(xiàn)多種?法。
多態(tài)與?多態(tài)的實(shí)質(zhì)區(qū)別就是函數(shù)地址是靜態(tài)綁定還是動(dòng)態(tài)綁定的。如果函數(shù)的調(diào)?,在編譯器編譯期間就可以確定函數(shù)的調(diào)?地址,并產(chǎn)?代碼,則是靜態(tài)綁定。?如果函數(shù)調(diào)?的地址不能在編譯器期間確定,需要在運(yùn)?時(shí)才確定,這就屬于動(dòng)態(tài)綁定。
19、 介紹一下C++里面的多態(tài)?
多態(tài)可以分為靜態(tài)多態(tài)(重載,模板)和動(dòng)態(tài)多態(tài)(覆蓋,虛函數(shù)實(shí)現(xiàn))。
lsy注:關(guān)于靜態(tài)多態(tài),可以看看C++primer這本書,大概在536頁(yè)左右。
1、靜態(tài)多態(tài)其實(shí)就是重載,因?yàn)殪o態(tài)多態(tài)是指在編譯時(shí)期決定調(diào)?哪個(gè)函數(shù),根據(jù)參數(shù)列表來(lái)決定。基本原理是,編譯器為函數(shù)?成符號(hào)表時(shí)的不同規(guī)則,重載只是?種語(yǔ)?特性,與多態(tài)?關(guān),與?向?qū)ο笠?關(guān),但這?是 C++中增加的新規(guī)則。
當(dāng)編譯器遇到一個(gè)模板定義時(shí),它并不生成代碼。只有當(dāng)實(shí)例化出模板的一個(gè)特定版本時(shí),編譯器才會(huì)生成代碼。
2、動(dòng)態(tài)多態(tài)是指通過(guò)?類重寫?類的虛函數(shù)來(lái)實(shí)現(xiàn)的,因?yàn)槭窃谶\(yùn)?期間決定調(diào)?的函數(shù),所以稱為動(dòng)態(tài)多態(tài)。函數(shù)的運(yùn)行版本由實(shí)參決定,在運(yùn)行時(shí)選擇函數(shù)的版本,所以稱為動(dòng)態(tài)綁定。執(zhí)行動(dòng)態(tài)綁定,即運(yùn)行基類指針指向派生類的對(duì)象,并調(diào)用派生類的函數(shù)。
?般情況下我們不區(qū)分這兩個(gè)時(shí)所說(shuō)的多態(tài)就是指動(dòng)態(tài)多態(tài)。
3、動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)與虛函數(shù)表,虛函數(shù)指針相關(guān)。
虛函數(shù)實(shí)現(xiàn)原理:虛函數(shù)表(存在對(duì)象的棧上或堆上)->虛函數(shù)指針(常量區(qū))->虛函數(shù)(代碼區(qū))。
純虛函數(shù):?virtual int fun() = 0;
擴(kuò)展:?類是否要重寫?類的虛函數(shù)??類繼承?類時(shí), ?類的純虛函數(shù)必須重寫,否則?類也是?個(gè)虛類,不可實(shí)例化。定義純虛函數(shù)是為了實(shí)現(xiàn)?個(gè)接?,起到?個(gè)規(guī)范的作?,規(guī)范繼承這個(gè)類的程序員必須實(shí)現(xiàn)這個(gè)函數(shù)。
20、 C++ 中重載和重寫,重定義的區(qū)別
1、重載
翻譯?overload,是指同?可訪問(wèn)區(qū)內(nèi)被聲明的?個(gè)具有不同參數(shù)列表的同名函數(shù),依賴于C++函數(shù)名字的修飾會(huì)將參數(shù)加在后?,可以是參數(shù)類型,個(gè)數(shù),順序的不同。根據(jù)參數(shù)列表決定調(diào)?哪個(gè)函數(shù),重載不關(guān)?函數(shù)的返回類型。
2、重寫
重寫翻譯?override,也叫覆蓋。子類重新定義父類中有相同名稱和參數(shù)的虛函數(shù)(virtual)。在繼承關(guān)系之間。C++利用虛函數(shù)實(shí)現(xiàn)多態(tài)。
重寫的特點(diǎn):
1被重寫的函數(shù)不能是static的。必須是virtual的
2重寫函數(shù)必須有相同的類型,名稱和參數(shù)列表
3重寫函數(shù)的訪問(wèn)修飾符可以不同。盡管父類的virtual方法是private的,派生類中重寫改寫為public,protected也是可以的。
3、重定義(隱藏)
派?類重新定義?類中相同名字的? virtual 函數(shù),參數(shù)列表和返回類型都可以不同,即?類中除了定義成 virtual 且完全相同的同名函數(shù)才不會(huì)被派?類中的同名函數(shù)所隱藏(重定義),否則就是重寫了(重寫與重定義的區(qū)別)。
總結(jié)
以上是生活随笔為你收集整理的二十万字C/C++、嵌入式软开面试题全集宝典三的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle数据库如何授权收费吗,如何减
- 下一篇: 二十万字C/C++、嵌入式软开面试题全集