什麼是多型
答:多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是」乙個介面多種實現「
多型的作用多型的分類
答:有兩種型別的多型性:
編譯時的多型性。編譯時的多型性是通過過載來實現的。
執行時的多型性。執行時的多型性是通過虛成員實現的。
在c++中如何實現多型
答:多型有動態多型,靜態多型,函式多型和巨集多型等。
動態多型基於繼承機制和虛函式來實現的。
靜態多型引入了泛型的概念。
函式多型基於函式過載。
巨集多型基於巨集替換。
為什麼要引入抽象基類和純虛函式
答:- 為了方便使用多型特性
- 在很多情況下,基類本身生成物件是不合理的。
補充:純虛函式在基類中是沒有定義的,必須在子類中加以實現。
如果基類含有乙個或多個純虛函式,那麼它就屬於抽象基類,不能被例項化。
虛函式與純虛函式有什麼區別
答:- 虛函式:如果乙個類中宣告了虛函式,這個函式是實現的,他的作用是為了能讓這個函式在他的子類裡面能被覆蓋,這樣就可以實現動態多型。
- 純虛函式只是乙個介面,是個函式的宣告而已,他留在子類中實現。
- 虛函式在子類中可以不過載
- 純虛函式必須在子類中實現
- 虛函式的類用作」實現繼承「,即繼承介面的同時也繼承了父類的實現。
- 純虛函式用於」介面繼承「,即純虛函式關注的是介面的統一性,實現由子類完成
- 帶純虛函式的類叫做虛基類,這種類不能直接生成物件。
虛析構函式的作用
答:虛析構函式保證了在析構時,避免只呼叫基類析構函式而不呼叫派生類析構函式的情況,保證資源正常釋放,避免了記憶體釋放。只有當乙個類被用來作為基類的時候,才會把析構函式寫成虛函式(最好把基類的析構函式定義為虛函式;(如果沒有定義為虛函式,當基類指標指向派生類,並且刪除指標時,會析構基類而不會析構派生類,造成記憶體洩漏))
類成員函式中過載/重寫(覆蓋)/重定義(隱藏)的區別?
答:分別簡單講述一下函式過載,函式覆蓋,函式隱藏的概念與特徵:
函式過載:過載函式通常用來命名一組功能相似的函式
1.函式要在相同的類域
2.函式的名字要相同
3.函式的引數列表
函式覆蓋:覆蓋是指派生類函式覆蓋基類函式
1.函式是要在不同的類域
2.兩個函式的名稱相同
3.基類函式必須是虛函式
3.兩個函式的引數相同
函式隱藏:指派生類的函式遮蔽了與其同名的基類函式
1.兩個函式在不同的類域
2.函式名稱相同
3.函式引數不同
4.如果派生類函式與基類函式引數相同,但是在基類函式中沒有virtual關鍵字,發生函式隱藏
什麼多型?說說你對多型的理解or多型有什麼作用?
答:多型: 即乙個介面多種實現
理解的多型:多型是物件導向的三大特性之一。多型分為靜態多型及動態多型。
靜態多型包含函式過載與泛型程式設計,靜態多型是程式呼叫函式,編譯器決定使用哪個可執行**塊。
動態多型是由繼承機制及虛函式實現的。通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。
多型的作用:把不同的子類物件都當作父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的**,做出通用的程式設計,以適應需求的不斷變化。
請實現乙個簡單的多型繼承關係?並講解一下c++的多型是怎麼實現的?
用c語言模擬實現c++多型呼叫
繼承的概念
答:繼承是物件導向的三大特性之一,繼承是指乙個物件直接使用另一物件的屬性和方法。
繼承可以使子類具有父類的各種屬性和方法。
繼承的主要目的是實現**的重用。
派生類與基類的轉換
答:派生類總是可以轉換為基類的引用型別。
基類轉換為派生類要在確認安全的條件下,使用強制轉換來進行。
私有繼承和組合有什麼相同點和不通點
答: 相同點:都表示「有乙個」的關係
不同點:私有繼承中派生類能訪問基類的protected成員,並且可以重寫基類的虛函式,組合不具有這些功能。
為什麼需要多重繼承,他的優缺點是什麼
答:為了解決實際生活中一些事物往往擁有兩個或兩個以上事物的屬性。
多重繼承的優點:物件可以呼叫多個基類的介面
多重繼承的缺點:容易出現繼承向上的二義性。即出現菱形繼承導致的二義性。
多重繼承中的二義性如何解決
答:兩個解決方案:
- 加上全域性符號確定呼叫哪乙份拷貝
- 使用虛擬繼承
單例模式
1.將構造,拷貝,賦值都放到private裡
2.1 static靜態區域性變數,存放在記憶體中的全域性資料區,只初始化一次
2.2 判斷是否為null,不為就new乙個
如何通過父類引用「呼叫」子類所獨有的方法
這也就是說多型的實現時,無法通過父類的指標去找到子類獨有的元素(如果是父類的引用也同理)。
解決方案是,在父類中宣告乙個虛函式用以向下型別轉換,在父類中給出其介面實現(否則會出現鏈結錯誤),在子類中自然給出其真正實現。
class derived;
// 前置宣告
class base
virtual const derived& downcast() const
};class derived :public base
const derived& downcast() const
void foo(){}
};
總結 繼承,多型
一.不能被繼承的父類成員 1.private 2.子類與父類不在同包,使用預設訪問許可權的成員。3.構造方法。二.訪問許可權 從小到大 private 私有的 friendly 預設 protected 受保護的 public 公有的 三.方法重寫規則 1.方法名相同。2.引數列表相同。3.返回值型...
繼承與多型
繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...
繼承與多型
虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...