25 c c 程式設計師面試寶典 繼承

2021-07-07 08:30:56 字數 3387 閱讀 5106

25.c/c++程式設計師面試寶典-繼承

繼承是物件導向軟體語言的3要素之一,在考查物件導向知識的時候繼承的相關題目出現的概率是很高的。繼承的實現是基於類的概念的。子類可以使用來自父類的各種方法和屬性,這樣提高了**的可復用率。繼承的同時子類也可以重新定義或者重寫某些屬性和方法,以實現更多不同的功能。

面試題105  派生類與基類的轉換***

分析:在c++中,基類指標可以指向派生類,也就是基類與派生類的型別轉換。派生類轉換為基類的示例**如下:

#include

using namespace std;

class base

virtual void print()  //定義虛函式

}; class derived : public base   //派生類

public:

derived() : b(2) {}

} 派生類轉換為基類又被稱為向上轉換,它總是隱含進行的。派生類轉換為基類總是合法和自動的。也就是說,派生類總是可以轉換為基類的引用型別。如果有乙個派生型別物件,則可以使用它的位址對基類的指標進行賦值或初始化。同樣,可以使用派生的引用或物件初始化基類的引用。嚴格來說,對物件沒有類似轉換。編譯器在執行時不會自動將派生型別物件轉換為基類型別物件。

有的時候,程式設計者已經知道當前指標所指向的物件是什麼型別,在可以確定基類轉換為派生類是安全的情況下,可以使用強制轉換完成基類轉換為派生類。基類是不會自動轉換為派生類的,因為基類物件只能是基類物件,它不能包含派生型別成員。基類轉換為派生類也被稱為向下轉換。基類轉換派生類的示例**如下:

#include

using namespace std;  

class cobject    //定義基類

}; class cdocument : public cobject   //定義派生類

}; class cmydoc : public cdocument

void func()

virtual void serialize()

}; int main()

【答案】派生類總是可以轉換為基類的引用型別。基類轉換為派生類需要在確定安全的情況下,使用強制轉換來進行轉換。

面試題106  什麼是虛成員?有什麼作用***

分析:在c++中,虛成員也被稱為虛函式,虛函式是用於物件導向中實現多型的機制。它的核心理念就是通過基類訪問派生類定義的函式。虛函式必須是基類的非靜態成員函式,它的訪問許可權可以是protected或者public,函式如果在基類中宣告為虛函式,它就一直為虛函式,派生類也不可以改變。派生類重定義虛函式時,可以使用virtual保留字,但這不是必須的。

虛函式的作用是實現動態解析,也就是在程式的執行階段動態的選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同的定義過程。事實上,虛函式只是乙個工具。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。動態解析規定,只能通過指向基類的指標或基類物件的引用來呼叫虛函式。虛函式使用的示例**如下:

#include

class cshape

void virtual display(void)  //定義虛函式 ;

class csquare

:public cshape

}; class c********:public cshape ;

class cellipse:public cshape ;

void main() ;

for(int i=0;i<4;i++)

pshape[i].display(); }

上面**的執行結果如下:

cshape

callipse

c********

csquare

注意:在派生類中,如果乙個派生類函式的名稱和引數列表和基類中宣告的虛函式相同,則返回型別也必須與虛函式一致。如果出現不一致的情況,這個派生類函式就不會被編譯。另外,虛函式也不能作為模板函式使用。

【答案】虛函式的作用是實現動態聯編,當程式發現虛函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態地選擇合適的成員函式。

面試題107  建構函式與析構函式的呼叫時機***

分析:建構函式是類中一種特殊的方法,它用來在建立物件時初始化物件,即為物件成員變數賦初始值。在c++中,建構函式與其他函式相比有一些特殊的方法,建構函式的命名必須和類名相同,而一般函式名則不能和類名相同。建構函式沒有返回值,所以它也沒有返回型別,不能使用void修飾。另外,建構函式也不可以直接被呼叫。定義乙個類的時候,通常情況下都會同時定義該類的建構函式,如果沒有提供,則c++提供乙個預設的建構函式,這個預設建構函式是無參建構函式,它僅負責建立物件。乙個建構函式的示例**如下:

class student

} student stu(a,b);  //宣告物件

上面**中,在建構函式中新增了引數和賦值初始化操作,建構函式將覆蓋預設建構函式。另外建構函式也可以不帶引數,甚至沒有任何操作。

析構函式與建構函式相反,當物件脫離其作用域時,系統會自動執行析構函式。析構函式往往用來做程式的「清理善後」的工作(例如,在建立物件時使用new分配了一塊記憶體空間,則應該在退出前在析構函式中用delete來進行釋放)。

在c++中,析構函式名也應該與類名相同,只是在函式名前面加乙個波浪符~,用來區別於建構函式。析構函式不帶任何引數。也沒有返回值,也不能使用void修飾符。類只能有乙個析構函式,不能過載。如果使用者沒有編寫析構函式,c++也會自動提供乙個預設的析構函式,這個析構函式不進行任何操作。乙個析構函式的示例**如下:

class test

test &operator=(const test &rhs)

~test()  //定義析構函式

private:

int x; };

建構函式和析構函式的呼叫時機介紹如下:

在類的物件首次被使用之前,建構函式將被應用在該物件上,建構函式和析構函式的呼叫是自動進行的。建立物件時會呼叫建構函式,而銷毀物件時會呼叫析構函式。

全域性物件的建構函式在main函式之前呼叫,析構函式在main函式執行結束之後呼叫。不同全域性變數的建構函式執行順序與變數定義的順序一致,而析構函式呼叫的順序正好相反。

自動區域性變數的建構函式在程式執行到定義區域性變數的語句時呼叫,在退出包含定義區域性變數的語句塊時呼叫析構函式。不同區域性變數的建構函式執行順序與變數定義的順序一致,而析構函式呼叫的順序正好相反。

靜態區域性變數的建構函式在程式第一次執行,到定義靜態區域性變數的語句時呼叫,而析構函式在main函式執行結束後呼叫。不同靜態區域性變數的建構函式執行順序與變數定義的順序一致。而析構函式呼叫的順序也是正好相反。

【答案】建構函式和析構函式的呼叫時自動進行的。建立物件時會呼叫建構函式,而銷毀物件時呼叫析構函式。

C C 程式設計師面試寶典 2

9.關聯式資料庫的正規化 10.資料庫操作中的事務 事務的4個特性 11.數字矩陣的生成 對應的 如下 include include include define print arr2d arr,n else print arr2d arr,n 1 2 6 7 15 3 5 8 14 16 4 9...

程式設計師面試寶典 C C 記憶體分類

在進行c c 程式設計時,需要程式設計師對記憶體的了解比較精準。經常需要操作的記憶體可分為以下幾個類別。棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等。其操作方式類似於資料結構中的棧。堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式節束時可能由操 作...

C 繼承 程式設計師面試寶典學習

通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。c 繼承 在c 語言中,乙個派生類可以從乙個基類派生,也可以從多個基類派生。從乙...