繼承和多型中常見的問題(一)
一、繼承:**的復用。
繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用**功能和提高執行時間的效果。
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...