答:多型,通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的物件去完成時會產生出不同的狀態。
其中多型又分為動態多型和靜態多型。
靜態多型:在程式編譯期間確定了程式的行為。
動態多型:在程式執行期間,根據具體拿到的物件確定程式的具體行為,呼叫具體的函式
答:過載:指函式名相同,返回值可以不同,但形參列表(引數個數或型別或順序)必須不同。兩個函式在同一作用域。
重寫(覆蓋):派生類中有乙個跟基類完全相同的虛函式,稱子類的虛函式重寫了基類的虛函式。其中:
(1)兩個函式分別在基類和派生類的作用域;
(2)函式名、引數、返回值都必須相同;
(3)兩個函式必須是虛函式。
重定義(隱藏):兩個基類和派生類的同名函式不構成重寫就是重定義。其中:
(1)兩個函式分別在基類和派生類的作用域;
(2)函式名相同,返回值可以不同;
(3)如果派生類的函式與基類的函式同名,但是引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆);
(4)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式被隱藏(注意別與覆蓋混淆)
答:編譯器發現乙個類中有虛函式,便會立即為此類生成虛函式表vtable。虛函式表的各表項為指向對應虛函式的指標。編譯器還會為此類中隱含插入乙個指標vptr(對vc編譯器說,它插在類的第一位置上)指向虛函式表。呼叫此類的建構函式時,在類的建構函式中,編譯器會隱含執行vptr與vtable的關聯**,將vptr指向相應的vtable,將類與此類的vtable聯絡起來。另外在呼叫類的建構函式時,指向基礎類的指標此時已經變成指向具體的類的this指標,這樣依靠此this指標即可得到正確的vtable,如此才能真正與函式體進行連線,這就是動態聯編,實現多型的基本原理。
虛函式是實現多型的基礎。
答:不能。因為靜態成員函式沒有this指標,使用型別::成員函式的呼叫方式無法訪問虛函式表,所以靜態成員函式無法放進虛函式表。
答:不能。因為物件中的虛函式表指標是在建構函式初始化列表階段才初始化的。
答:析構函式可以是虛函式,而且當要使用基類指標或引用呼叫子類時,最好將基類的析構函式宣告為虛函式,否則可以存在記憶體洩露的問題。
虛函式的目的就是通知系統在函式呼叫時能夠自動識別對應的類物件型別,從而能夠根據指標所指型別呼叫對應的類物件,實現函式呼叫時的多型性。 對於析構函式而言,同樣適用於上述規則。如果析構函式不是虛函式,那麼在呼叫該函式時(物件被刪除時)則只會呼叫當前物件對應的類的析構函式,這對於直接定義的物件是沒有什麼影響的,但是對於使用基類指向派生類的指標而言,因為基類指標實際上是基類型別,所以析構時自然只會呼叫基類的析構函式,這就可能產生記憶體洩漏(因為派生類的析構函式不被呼叫)。所以如果確定程式中有基類指標指向派生類的問題,則必須將基類的析構函式指定為虛函式,如此才能確保new出來的物件被正確的delete。
答:首先如果是普通物件,是一樣快的。如果是指標物件或者是引用物件,則呼叫的普通函式快,因為構成多型,執行時呼叫虛函式需要到虛函式表中去查詢。
答:虛函式表是在編譯階段就生成的,一般情況下存在**段中。
答:包含純虛函式的類叫做抽象類,抽象類不能例項化出物件。
抽象類的作用:抽象類強制重寫了虛函式,另外抽象類體現了介面繼承關係。
C 常見面試問題
一 抽象與介面的區別 1,抽象 abstract 1 抽象類中可以有抽象方法,也可沒有 2 抽象方法包含實現,也可以由子類實現 3 抽象類不能被sealed修飾,只能使用abstract關鍵字 4 抽象方法不能在抽象類外部宣告 5 抽象類只能單繼承 6 可以有虛方法 virtual 在不同的繼承中,...
SVM常見面試問題
答 幾何間隔與樣本的誤分次數間存在關係 其中的分母就是樣本到分類間隔距離,分子中的r是所有樣本中的最長向量值 答 會,超平面會靠近樣本少的類別。因為使用的是軟間隔分類,而如果對所有類別都是使用同樣的懲罰係數,則由於優化目標裡面有最小化懲罰量,所以靠近少數樣本時,其懲罰量會少一些。比如 假設理想的分隔...
SpringMVC 常見面試問題
springmvc流程 原理 流程圖 亂碼問題 重定向和 在返回值前面加 redirect 或 forward return forward 跳轉的頁面或路由 重定向和 的區別 全域性異常 自定義實現spring的全域性異常解析器handlerexceptionresolver springboot...