C 學習記錄(18) NVI

2021-08-28 04:25:02 字數 1531 閱讀 8387

non-virtual inte***ces(nvi),非虛擬介面,私有虛函式。

令客戶通過 public non-virtual 成員函式間接呼叫 private virtual 函式,是 template mothod 設計模式的一種獨特表現形式。這個 non-virtual 虛函式稱為 virtual 函式的外覆器。(摘自《effective c++》)

簡單示例:

#include #include #include #include class system 

} ;// 基類, 訪問

// public non-virtual 介面 --> add 外覆器

// private virtual 介面 --> 強制派生類實現(預設也可)

class access

virtual ~access() = default;

void add(std::string name)

private:

virtual void addperson(std::string name) = 0 ;

static void logcall(const std::string &name)

private:

system *ptr;

} ;// 派生類, 學生訪問

class studentaccess : public access

private:

// 直接進行純資料操作

virtual void addperson(std::string name) override

private:

system *ptr;

} ;int main ()

基類的 public non-virtual 外覆器可以確保在真正的 virtual 函式操作之前設定好適當場景,並在呼叫結束後清理場景。「事前工作」可以包括鎖定互斥器(lock a mutex),製造運轉日誌記錄項(log entry),驗證 class 約束條件,驗證函式先決條件等;「事後工作」可以包括解除互斥器(unlock a mutex),製造運轉日誌等。(摘自《effective c++》)

特點:

(1)介面與實現分離,基類負責邏輯和事前事後工作,派生類專心負責資料操作。

(2)基類更加穩定。倘若派生類實現部分改動,只需要重新編譯派生類所在檔案即可,不影響基類的邏輯部分。基類掌控介面所有權——如果不是 nvi,採用的是普通的虛函式覆蓋機制,基類中加入的邏輯判斷一旦改動,在所有派生類中的邏輯部分都要改動(因為派生類的 virtual 虛函式會覆蓋基類的 virtual 虛函式),這些檔案都要重新編譯。一定程度上,nvi 的基類集中了對邏輯的掌控,而且不能被子類覆蓋,這就是「 public non-virtual 」 介面,不是虛函式的原因。而 virtual 介面是 private 的原因——防止越過「邏輯部分」直接呼叫 virtual 函式的情況,純資料操作如果不加入一些邏輯或者執行緒保護容易出現 bug。

c 學習筆記(18)

類模板做友元 全域性函式類內實現 直接在類內宣告友元 全域性函式類外實現 需要提前讓編譯器知道全域性函式的存在 template classt1,class t2 class person 全域性函式的類內實現 friend void printperson personp 加入空模板的引數列表,表...

C 學習記錄

由於之前寫c c 程式時,動不動就容易報錯,也就沒繼續用,一直覺得c 很難。最近在學習機器學習時,用到了乙個c 神經網路庫,並且在菜鳥教程中看到了c 的教程,於是學了一下,發現根本沒有想象中的那麼難,可能也是這個教程講的比較好吧。現在把一些學到的比較重要的點記錄一下吧!1.ifndef 突然覺得在標...

C 學習記錄

原創 主要是c 和c 不同的地方,會寫一下,流程控制什麼的都差不多,比較適合c 轉c 的人看 以前沒有系統的學過c 現在補一下,以前完全是為了看懂別人的 稍微看一下,也沒有太想在這方面下功夫,學一點是一點,目標是能修改別人的c 服務端程式。一.包含 包含原理上什麼檔案都能包含進來,但是一般只包含.c...