C 面試題 之繼承與介面

2022-02-22 12:58:41 字數 3009 閱讀 7360

整個c++程式設計全面圍繞物件導向的方式進行。類的繼承特性是c++的乙個非常重要的機制。繼承特性可以使乙個新類獲得其父類的操作和資料結構,程式設計師只需在新類中增加原有類沒有的成分。

在面試過程中,各大企業會考量你對虛函式、純虛函式、私有繼承、多重繼承等知識點的掌握程度,因此就有了我們這一節的內容,開始吧。

#includeusing namespace std;

class a

int getdata()

virtual int dogetdata() };

class b : public a

int dogetdata() };

class c : public b

};int main ()

解析:這是乙個虛函式覆蓋虛函式的問題。a類裡的f()函式是乙個虛函式,虛函式是被子類同名函式所覆蓋的。而b類裡的f()函式也是乙個虛函式,它覆蓋a類f()函式的同時,也會被它的子類覆蓋。但是在 b* pb=(b*)pa;裡面,該語句的意思是轉化pa為b型別並新建乙個指標pb,將pa複製到pb。但是這裡有一點請注意,就是pa的指標始終沒有發生變化,所以pb也指向pa的f()函式。這裡並不存在覆蓋的問題。

delete pa,pb;刪除了pa和pb所指向的位址,但是pa、pb指標並沒有刪除,也就是我們通常說的懸浮指標,現在重新給pa指向新位址,所指向的位置是b類的,而之前pa指標型別是a類的,所以就產生了乙個覆蓋。pa->f();的值是b。

pb=(b*)pa;轉化pa為b類指標給pb賦值,但pa所指向的f()函式是b類的f() 函式,所以pb所指向的f()函式是b類的f()函式。pb->f();的值是b。

答案:

a a b b

答案:

(1)公有繼承方式:

基類成員對其物件的可見性與一般類及其物件的可見性相同,公有成員可見,其他成員不可見。這裡保護成員與私有成員相同。

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員可見,基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態;基類的私有成員不可見,基類的私有成員仍然是私有的,派生類不可訪問基類中的私有成員。

基類成員對派生類物件的可見性對派生類物件來說,基類的公有成員是可見的,其他成員是不可見的。

(2)私有繼承方式:

基類成員對其物件的可見性與一般類及其物件的可見性相同,公有成員可見,其他成員不可見。

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員可見,基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問;基類的私有成員不可見,派生類不可訪問基類中的私有成員。

基類成員對派生類物件的可見性對派生類物件來說,基類的所以成員都是不可見的。

所以說,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。

(3)保護繼承方式:

這種繼承方式與私有繼承方式的情況相同,兩者的區別僅在於對派生類的成員而言,基類成員對其物件的可見性與一般類及其物件的可見性相同,公有成員可見,其他成員不可見。

基類成員對派生類的可見性對派生類來說,基類的公有成員和保護成員可見,基類的公有成員和保護成員都作為派生類的保護成員,並且不能被這個派生類的子類所訪問;基類的私有成員不可見,派生類不可訪問基類中的私有成員。

基類成員對派生類物件的可見性對派生類物件來說,基類的所以成員都是不可見的。

所以說,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。

#includeusing namespace std;

class a;};

class b : public virtual a;};

class c : public virtual b;};

int main ()

解析:(1)對於a類,由於有乙個虛函式,那麼必須有乙個對應的虛函式表來記錄對應的函式入口位址。每個位址需標有乙個虛指標,指標的大小為4。類中還有乙個char k[3],每乙個char值所佔空間是1,所以char k[3]所佔大小是3。做乙個資料對齊後變為4。所以,sizeof(a)的結果就是char k[3]所佔大小4和虛指標所佔大小4之和等於8。

(2)對於b類,由於b繼承了a,同時還擁有自己的虛函式,那麼b中首先擁有乙個vfptr_b,指向自己的虛函式表。還有char j[3],大小為4,可虛繼承該如何實現呢?首先要通過加入乙個虛類指標(記vbptr_b_a)來指向其父類,然後還要包含父類的所有內容,所以sizeof(b)的大小是:a類所佔大小8,char j[3]所佔大小4,vfptr_b所佔大小4,vbptr_b_a所佔大小4,它們之和等於20。

(3)對於c類和b類差不多,結果是32。

答案:

sizeof(a):8

sizeof(b):20

sizeof(c):32

答案:

虛擬繼承是多重繼承中特有的概念。虛擬基類是為了解決多重繼承而出現的,請看下圖:

在圖 1中,類d接觸自類b和類c,而類b和類c都繼承自類a,因此出現了圖 2所示的情況。

在圖 2中,類d中會出現兩次a。為了節省記憶體空間,可以將b、c對a的繼承定義為虛擬繼承,而a成了虛擬基類。最後形成了圖 3。

**如下:

class a;

class b : public virtual a;

class c : public virtual a;

class d : public b,public c;

繼承與介面這一節寫完了,感覺收穫很多啊,希望你們也和我一樣。因為本人算是初學者,所以很多知識點說得不夠簡練,甚至不正確的,請多多包涵和指正。

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...

C 面試題之sizeof面試題

sizeof面試題1.cpp what is the output of the following code?美國某著名計算機軟硬體公司面試題 include include include using namespace std structa structb int main 解析 ss1是乙...

C 面試題之繼承 過載 多型

1.什麼是繼承?繼承的作用是什麼?2.什麼是過載 什麼是覆蓋 重寫 什麼是隱藏 重定義 相同的作用域 在同乙個類中 函式名相同引數不同virtual 關鍵字可有可無 不同的作用域 分別位於派生類與基類 函式名相同 引數相同 基類中必須有 virtual 關鍵字 注意 重寫基類函式的時候,會自動轉換這...