答:多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是」乙個介面多種實現「
有兩種型別的多型性:
編譯時的多型性。編譯時的多型性是通過過載來實現的。
執行時的多型性。執行時的多型性是通過虛成員實現的。
1.從儲存空間角度。虛函式對應乙個vtable,這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。
2,從使用角度建構函式本身就是要初始化例項,那使用虛函式也沒有實際意義呀。所以建構函式沒有必要是虛函式。虛函式的作用在於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式。而建構函式是在建立物件時自動呼叫的,不可能通過父類的指標或者引用去呼叫,因此也就規定建構函式不能是虛函式。
3、建構函式不需要是虛函式,也不允許是虛函式,因為建立乙個物件時我們總是要明確指定物件的型別,儘管我們可能通過實驗室的基類的指標或引用去訪問它。
**4、從實現上看,**vbtl在構造函式呼叫後才建立,因而建構函式不可能成為虛函式
答:假設沒有設定成虛函式,如果有基類指標指向派生類,那麼用基類指標delete時,如果不定義成虛函式,派生類中派生的那部分無法析構,造成記憶體洩漏。
答:分別簡單講述一下函式過載,函式覆蓋,函式隱藏的概念與特徵:
函式過載:過載函式通常用來命名一組功能相似的函式
1.函式要在相同的類域
2.函式的名字要相同
3.函式的引數列表或返回值不同
函式覆蓋:覆蓋是指派生類函式覆蓋基類函式
1.函式是要在不同的類域
2.兩個函式的名稱相同
3.基類函式必須是虛函式
4.兩個函式的引數相同
函式隱藏:指派生類的函式遮蔽了與其同名的基類函式
1.兩個函式在不同的類域
2.函式名稱相同
3.函式引數不同
4.如果派生類函式與基類函式引數相同,但是在基類函式中沒有virtual關鍵字,發生函式隱藏
不能!友元只是能訪問指定類的私有和保護成員的自定義函式,不是被指定類的成員,自然不能繼承。 使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。
(3)友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元,同樣要看類中是否有相應的申明
基類與派生類的靜態成員函式與靜態成員是共用一段空間的,即靜態成員和靜態成員函式是可以繼承的。
所以,我們可以得出以下結論:
父類的static變數和函式在派生類中依然可用,但是受訪問性控制(比如,父類的private域中的就不可訪問)。而且對static變數來說,派生類和父類中的static變數是共用空間的,這點在利用static變數進行引用計數的時候要特別注意。
1.基類物件首先被建立
2.派生類建構函式應通過成員初始化列表(呼叫順序和繼承順序相關)將基類資訊傳遞給基類建構函式 ,可以使用初始化列表句法指明要使用的基類建構函式,否則將使用預設的基類建構函式。
3.派生類建構函式應初始化派生類新增的資料成員
派生類物件析構時,程式首先呼叫派生類析構函式,再呼叫基類析構函式。
多型面試題
題目的 如下 class a public string show a obj class b extends a public string show a obj class c extends b class d extends b a a1 new a a a2 new b b b new b...
面試題 多型
多型是物件導向的第三大特性 封裝 繼承 多型 用以描述現實世界中同一事物的不同形態。比如,西服 t恤和夾克都繼承至 衣服 它們都是衣服的一種形態。多型的三個條件 子類繼承父類 子類重寫父類方法 向上轉型 此外還有抽象類的多型和介面的多型 子類繼承父類 有靜態和非靜態方法分別輸出靜態和非靜態變數,子類...
C 多型類面試題
什麼是多型?答 不同的物件完成相同的事件 具有相同的函式 產生不同的結果 函式內部實現不同 什麼是過載 重寫 重定義?作用域函式名 引數 返回值的要求 其它的要求 過載兩個函式在同一作用域 函式名 引數相同 重寫 覆蓋 兩個函式分別在基類和派生類的作用域 函式名 引數 返回值都相同 兩個函式必須是虛...