C++面試,你知道嗎?

在後端面試中語言特性的掌握直接決定面試成敗,因此本公眾號在在後續會持續輸出編程語言的必知必會知識點系列。

C++語言一直在增加很多新特性來提高使用者的便利性,但是每種特性都有複雜的背後實現,充分理解實現原理和設計原因,才能更好地掌握這種新特性。

C++面試,你知道嗎?

只要出發總會達到,只有出發才會到達,焦慮沒用,學就完了,今天一起來學習C++的虛函數考點吧。

通過本文你將瞭解的以下內容:

  • C++多態機制
  • 虛函數的基本使用
  • 虛函數的底層實現
  • 純虛函數和抽象類
  • 虛析構函數
  • 虛函數的優缺點

1.C++多態機制

  • 多態機制簡介

C++面向對象的三大特徵:

  • 多態(Polymorphism)
  • 封裝(Encapsulation)
  • 繼承(Inheritance)

從字面上理解多態就是多種形態,具體如何多種形態,多態和繼承的關係非常密切,試想下面的場景:

  • 派生類繼承使用基類提供的方法,不需更改
  • 同一個方法在基類和派生類的行為是不同的,具體行為取決於調用對象。

後者就是C++的多態需求場景,即同一方法的行為隨調用者上下文而異,舉個現實生活中類似的栗子,來加深理解:

基類Woker包括三個方法:打卡、午休、幹活。

派生類包括產品經理PMer、研發工程師RDer、測試工程師Tester,派生類從基類Worker中繼承了打卡、午休、幹活三個方法。

打卡和午休對三個派生類來說是一樣的,因此可以直接調用基類的方法即可。

但是每個派生類中幹活這個方法具體的實現並不一樣:產品經理提需求、研發寫代碼、測試找Bug。

SomeWhere

C++面試,你知道嗎?

計算機程序的出現就是為了解決現實中的問題,從上面的例子可以看到,這種同一方法的行為隨調用者而異的需求很普遍,然而多態的設計原因只有C++之父Bjarne Stroustrup大佬最清楚了。

  • 靜態綁定和動態綁定要充分理解多態,就要先說什麼是綁定?

綁定體現了函數調用和函數本身代碼的關聯,也就是產生調用時如何找到提供調用的方法入口,這裡又引申出兩個概念:

  • 靜態綁定:程序編譯過程中把函數調用與執行調用所需的代碼相關聯,這種綁定發生在編譯期,程序未運行就已確定,也稱為前期綁定。
  • 動態綁定:執行期間判斷所引用對象的實際類型來確定調用其相應的方法,這種發生於運行期,程序運行時才確定響應調用的方法,也稱為後期綁定。
  • 靜態多態和動態多態

在C++泛型編程中可以基於模板template和重載override兩種形式來實現靜態多態。

動態多態主要依賴於虛函數機制來實現,不同的編譯器對虛函數機制的實現也有一些差異,本文主要介紹Linux環境下gcc/g++編譯器的實現方法。

多態本質上是一種泛型技術,說白了就是試圖使用不變的代碼來實現可變的算法,要麼試圖在編譯時決定,要麼試圖在運行時決定。

csdn博客專家-左耳朵耗子-陳皓

  • 虛函數與三大特徵

虛函數為多態提供了基礎,並且藉助於繼承來發揮多態的優勢,從而完善了語言設計的封裝,可見虛函數與C++三大特徵之間有緊密的聯繫,是非常重要的特性。

C++面試,你知道嗎?

2.虛函數的基本使用

  • 虛函數使用實例

使用virtual關鍵字即可將成員函數標記為虛函數,派生類繼承基類的虛函數之後,可以重寫該成員函數,派生類中是否增加virtual關鍵字均可,代碼舉例:

  • 基類對派生類的訪問

通過基類的指針或引用指向派生類的實例,在面向對象編程中使用非常普遍,這樣就可以實現一種基類指針來訪問所有派生類,更加統一。

這種做法的理論基礎是:一個派生類對象也是一個基類對象,可以將派生類對象看成基類對象,但是期間會發生隱式轉換。

  • A *pA = new B;
  • B b; A &rb=b;

好啦,今天就分享到這啦!喜歡此篇文章或覺得這篇文章對你有幫助的讀者可以分享給身邊的朋友們。如果你是小白也可以私信回覆“資料”領取大禮包一份,以及開發工具一份

C++面試,你知道嗎?


分享到:


相關文章: