繼承和多型中常見的問題(一)

2021-08-06 07:54:19 字數 2546 閱讀 3292

繼承和多型中常見的問題(一)

一、繼承:**的復用。

繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用**功能和提高執行時間的效果。

1、繼承的方式:由於c++中有三種訪問限定符,public,private,protected.因此在類與類的繼承中也將有這三種方式。繼承方式如圖:

面試題1.private和protected兩者之間的區別是什麼?

兩者的主要區別是在繼承中展現的,如上表可知,private,在繼承中外部函式不可以訪問,在派生類中也不可以訪問。

protected在繼承中外部函式不可以訪問,但在派生類中是可以訪問的。

2、派生類物件的構造順序:派生類給基類構造,要呼叫基類的建構函式來進行構造

先構造基類的成員物件

構造基類自己

構造派生類的成員物件

呼叫派生類的建構函式

3、基類和派生類成員方法之間的關係:

過載:(在同乙個作用域下),根據引數列表,返回值,引數個數 

隱藏:基類和派生類在繼承結構中,派生類的同名成員把基類的同名成員隱藏了,如果需要呼叫基類的該方法,在該方法呼叫前加上基類作用域即可。

覆蓋(指的是虛函式表中的覆蓋):基類和派生類繼承結構中,返回值,引數列表,函式名都相同,而且基類的該函式是virtual函式,那麼派生類函式也是virtual函式了。

4、c++型別的強**

a.const_cast:去掉物件的const屬性的強轉

b.static_cast:更安全的型別強轉,(編譯器認為可以支援的強轉安全性略高)

c.reinterpret_cast:非常底層的型別強轉。(類似於c的強轉)

d.dynamic_cast:支援rtti型別的強轉(執行時型別識別的強轉)。如果要轉的型別試執行時的型別,則返回乙個值,否則返回乙個空。

5、基類物件和派生類物件之間的轉換:編譯器預設從下往上的轉換)

6、虛函式virtual()

面試題2:建構函式是否可以是虛函式?inline函式是否可以是虛函式?析構函式是否可以是虛函式?static函式是否可以是虛函式?

2、物件必須存在(兩者缺一不可)

由以上可以得出:建構函式不可以是虛函式,因為建構函式中沒有物件,在呼叫完建構函式時物件才生成。inline函式不可以是虛函式,因為inline函式不能取位址。析構函式可以是虛函式。用乙個基類指標指向堆上的派生類物件,要講析構函式寫為虛函式否則派生類的物件無法析構。

面試題3:動態繫結和靜態繫結的區別是什麼?

靜態繫結:編譯時期的繫結。動態繫結:是指執行時期的繫結(兩者的不同需要從彙編的角度來看)

derive der(10);

base *p = &der;

p->show(10);//call base::show(int)

p->show();//call base::show();

當show()為虛函式時,p->show();彙編指令為:

mov ecx,dword ptr[p]   //先找到vfptr,後找到vftable,找到虛函式的位址

mov eax,dword ptr[ecx]

call eax //動態繫結呼叫暫存器

動態繫結先找到vfptr,後找到虛表,再找到虛函式的記憶體(彙編資訊),動態繫結可以通過虛指標找到存在虛表上的rtti(物件型別的執行資訊)

靜態繫結直接call

7、什麼情況下會發生多型的編譯/呼叫?(什麼樣的情況下會發生動態繫結?)

指標和引用一定會發生動態繫結。

(1)不管是基類指標指向基類物件,或者派生類引用指向派生類物件,都會發生多型。

(2)派生類指標指向基類物件、派生類物件都會發生多型

(3)一定是在虛表中。

8、繼承和多型中常見的問題:

(1)派生類是虛函式,基類是普通函式。(基類沒有虛指標和虛表)

如果派生類沒有從基類繼承到vfptr,那麼派生類中產生vfptr。該vfptr一定排到最前端;如果從基類幾層了vfptr,派生類自己的vfptr不產生,產生的vftable內容合併到基類的vftable中。並且基類指標一定要精確的指向派生類基類部分的起始位址。

(2)繼承時建構函式不能給函式預設值,這樣派生類中永遠得不到該預設值。

(3)繼承時在建構函式中呼叫虛函式,永遠都是靜態繫結。(因為在此時,還沒有物件,不存在虛函式,故不會發生動態繫結)

9、靜態的多型和動態的多型有什麼樣的區別?

靜態的多型是在編譯時期就存在的,而動態的多型是在執行時體現出的多型。

靜態的多型:eg.a.模板(在呼叫點就要例項化)b.函式的過載

動態的多型:eg.call虛函式 (call   eax)

繼承與多型中常見的問題(二)

繼承與多型中常見的問題分析 1 畫出派生類derive的記憶體布局 1 如果base中的show函式是虛函式,那麼p show 則動態繫結,列印出derive show 2 如果base中的show函式不是虛函式,derive中的show函式不是虛函式,那麼p show 則靜態繫結,列印出base ...

多型中常見的面試題

1.什麼是多型?多型就是面對同一函式,用不同的物件去呼叫,會產生不同的結果 2.什麼是過載 重寫 覆蓋 重定義 隱藏 過載 當兩個函式同名,引數不同,且再同乙個作用域內,就叫做過載 重寫 當兩個函式同名,引數相同,返回值相同 這裡有個特例,協變例外 且在不同作用域,都是虛函式,叫做重寫 重定義 繼承...

jquery mobile 中常見的問題

基礎篇 1 jquery mobile 只會從載入的文件中取出第乙個頁面 第乙個帶role page 的div 其他內容都將被忽略。即所有目標文件的head元素中的資訊以及其他在首個頁面元素之外的內容都被忽略。2 為避免dom占用過多記憶體,當外部載入頁面變得不可見時 再後退或前進到乙個新頁面後 j...