日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 15 OOP)虚函数

發(fā)布時間:2025/3/21 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 15 OOP)虚函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 定義

基類希望其派生類進行覆蓋的函數(shù)(虛函數(shù))。

  • 基類通過在成員函數(shù)前面加上 virtual 函數(shù)使得該函數(shù)執(zhí)行動態(tài)綁定。
  • 任何構(gòu)造函數(shù)之外的非靜態(tài)函數(shù)都可以是虛函數(shù)。
  • 關鍵字 virtual 只能出現(xiàn)在類內(nèi)部聲明語句之前,不能用于類外部的函數(shù)定義。
  • 如果基類把一個函數(shù)寫成虛函數(shù),則該函數(shù)在派生類中隱式地也是虛函數(shù)。

1.1 虛函數(shù)的調(diào)用可能在運行時才被解析

1.2 注意:

  • 基類的析構(gòu)函數(shù)通常都應該定義成虛函數(shù)。
  • 一旦某個函數(shù)被聲明成虛函數(shù),則在所有的派生類中它都是虛函數(shù)

1.3 看一個派生類的函數(shù)是否覆蓋基類的虛函數(shù)

  • 若沒有,則該函數(shù)的行為類似于其他成員,派生類會直接繼承其在基類中的版本,認為兩個函數(shù)相互獨立
  • 若有,則它的形參類型必須被它覆蓋的基類函數(shù)完全一致;返回類型也必須相同。該規(guī)則存在一個例外:類的虛函數(shù)返回類型是本身的指針或引用。

2. final 和 override 說明符
2.1 override

C++ 11 新標準使用 override 關鍵字來覆蓋基類的虛函數(shù)

struct B {virtual void f1(int) const;virtual void f2();void f3(); };struct D1 : B {void f1(int) const override; // ok: f1 matches f1 in the basevoid f2(int) override; // error: B has no f2(int) functionvoid f3() override; // error: f3 not virtualvoid f4() override; // error: B doesn't have a function named f4 }
  • 如果基類并沒有覆蓋已存在的虛函數(shù),或者參數(shù)不對應則都會產(chǎn)生編譯錯誤。

2.2 final

函數(shù)也可以通過添加final關鍵字來禁止覆蓋操作。

struct D2 : B {// inherits f2() and f3() from B and overrides f1(int)void f1(int) const final; // subsequent classes can't override f1(int) }; struct D3 : D2 { void f1(int) const ; // error };

2.3 final 和 override 關鍵字應該出現(xiàn)在形參列表(包括任何const或引用修飾符)以及尾置返回類型之后。

3. 默認實參

虛函數(shù)也可以有默認實參,每次函數(shù)調(diào)用的默認實參值由本次調(diào)用的靜態(tài)類型決定。
如果通過基類的指針或引用調(diào)用函數(shù),則使用基類中定義的默認實參,即使實際運行的是派生類中的函數(shù)版本也是如此。

eg.

struct A{ void f1(int a, int b = 0) const {std::cout << "a f1" << endl;}};struct B : A{void f1(int a, int b = 2) const {std::cout << "b f1" << endl;}};A a;B b;a.f1(1);b.f1(1);A* pa = &b; pa->f1(1);

輸出:

a f1 b f1 a f1
  • 如果虛函數(shù)使用默認實參,則基類和派生類中定義的默認實參值最好一致。

4. 回避虛函數(shù)的機制

可以使用作用域符限制虛函數(shù)的動態(tài)綁定,而是強迫其執(zhí)行虛函數(shù)的某個特定版本

//強行調(diào)用基類中定義的函數(shù)版本而不管baseP的動態(tài)類型到底是什么 double undiscounted=baseP->Quote::net_price(42);
  • 通常情況下,只有成員函數(shù)(或者友元)中的代碼才需要使用作用域運算符來回避虛函數(shù)的機制。
  • 通常是一個派生類的虛函數(shù)調(diào)用它覆蓋的基類的虛函數(shù)版本時。

注意:如果一個派生類虛函數(shù)需要調(diào)用它的基類版本,但是沒有使用作用域運算符,則在運行時該調(diào)用將被解析為對派生類版本自身的調(diào)用,從而導致無限遞歸。

【引用】

[1] 代碼oopTest.h

總結(jié)

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 15 OOP)虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。