C 面試題之繼承 過載 多型

2021-10-23 13:00:27 字數 1978 閱讀 5053

1. 什麼是繼承?繼承的作用是什麼?

2. 什麼是過載、什麼是覆蓋(重寫)、什麼是隱藏(重定義)?

相同的作用域(在同乙個類中)

函式名相同引數不同virtual 關鍵字可有可無

不同的作用域(分別位於派生類與基類)

函式名相同

引數相同

基類中必須有 virtual 關鍵字

注意:重寫基類函式的時候,會自動轉換這個函式為 virtual 函式,不管有沒有加 virtual,因此重寫的時候不加 virtual 也是可以的,不過為了易讀性,還是加上比較好

不同的作用域(分別位於派生類與基類)

如果派生類的函式與基類的函式同名,不管引數列表是否不同並且基類函式沒有 virtual 關鍵字。此時,基類的函式將被隱藏(注意別於過載混淆,過載是在同乙個類中,而重寫是在不同類中

3. 什麼是菱形繼承?菱形繼承的問題是什麼?怎麼解決?解決的原理是什麼?

4. 什麼是is-a,什麼是has-a?繼承和組合哪個更好?為什麼?

is-a(是 「a」,小明是人類)表示屬於關係。比如兔子屬於一種動物(繼承關係)。

has-a(有 「a」,汽車有輪胎)表示組合,包含關係。比如兔子有腿,有耳朵,就不能說兔子腿屬於一種兔子(不能說是繼承關係)

對兩個類之間"is a"或是"has a"關係的分析,有助於我們確定它們之間是否存在繼承關係,避免設計上的錯誤,因而達到提高**重用性的目的

5. 什麼是多型?多型的條件是什麼?多型的實現原理是什麼?為什麼使用多型?(幾乎必考,重點重點重點)

必須通過基類的指標或引用呼叫虛函式

被呼叫的函式必須是虛函式,且派生類必須對基類的虛函式進行重寫

6. 為什麼c++支援過載,c語言不支援?

其實主要是通過兩種語言的命名機制決定的。通過彙編**我們可以知道,對 c 語言中函式名的命名機制是直接使用函式名來命名的,所以在 c 語言中,每乙個函式名只能對應乙個函式,所以 c 語言不支援過載;而 c++ 的函式命名機制是通過 「函式名+引數列表」 進行命名的,所以它們在彙編中命名不同,可以實現函式過載。

7. inline函式、建構函式、析構函式、static 函式是否可以是虛函式?

建構函式不能是虛函式:因為物件的虛函式表指標是在建構函式初始化列表階段才初始化的

析構函式可以是虛函式:並且最好把基類的析構函式定義成虛函式

static 函式不能是虛函式:因為靜態成員函式沒有 this 指標,使用 型別::成員函式的呼叫方式無法訪問虛函式表,所以靜態成員函式無法放進虛函式表

8. 基類為什麼需要虛析構函式?

當用基類的指標或者引用指向派生類物件時,只有基類將析構函式定義成虛函式,派生類中的析構函式才能覆蓋其基類的析構函式,從而再釋放物件時,才能夠呼叫到派生類的析構函式,防止記憶體洩漏。

9. 什麼是虛函式?什麼是純虛函式?虛函式存在哪兒?虛表存在哪?

10. 哪些函式不能成為虛函式?

封裝繼承多型 繼承重寫過載

物件導向三大基本特徵 封裝 繼承 多型 封裝 首先封裝的意思就是將客觀事物封裝成抽象的類,封裝可以看做是乙個保護屏障,將實現細節全都隱藏起來,防止該類的 和資料被外部類定義的 隨機訪問。要訪問該類的 和資料,必須通過嚴格的介面控制。他的優點在於1.良好的封裝能夠減少耦合。2.類的內部結構可以自有修改...

C 多型繼承相關面試題

一 相關概念 類的編譯順序 類名 成員名 成員方法體 類的構造順序 成員物件 類物件 子類的構造 父類 子類 子類的析構 子類 父類 過載 函式名相同 引數列表不同 作用域相同 隱藏 子類隱藏父類中同名的成員方法 覆蓋 子類覆蓋父類中相同的許成員方法 動多型 繼承中的多型 執行時期決定的多型 靜多型...

Java 繼承 過載 重寫 多型

父類 class engineer public engineer int no,string name,string entertime public void showinfo get和set方法省略 class softengineer extends engineer public soft...