純虛函式能為private嗎

2021-06-19 06:26:24 字數 1605 閱讀 8391

我們把乙個僅僅含有純虛函式的類稱為介面,我們也好像已經習慣了將這個介面中的所有純虛函式全宣告為public,而且按照這樣的設計,一切都工作得不錯。

比如com正是這樣做的,它的介面中幾乎不會存在private的純虛函式。那麼,讓我們想一想,純虛函式或者虛函式可以為private嗎?如果這種方式是可行的,

一.訪問限定符與繼承

如果基類隱式(間接)向子類暴露了私有成員,那麼從某種意義上講,該私有成員對於子類是可見的。

任何一本講c++基礎的課本上都詳細地介紹了訪問限定符與繼承的關係,在這裡就不重複了,但是,課本上的東西並不全,不信?那麼請先看看下面的例子:

c++語言: c++例子#include #include using namespace std;

class base

protected:

virtual void dowork() =0 ; //純虛函式

public:

void work()

virtual void step2(void ) // 可以被派生類修改的實現細節

protected:

virtual void step3(void ) =0; // 必須被派生類修改的實現細節

public:

void work(void) // 骨架函式,實現了骨架

}; 注意,上例中根本沒有暴露任何虛函式,所有的這一切都是通過work()這個非虛的public介面展現出來的,當我們用乙個basetemplate指標呼叫work()時,

表面上是乙個非虛函式呼叫,採用靜態繫結,事實上也正是這樣,但是,這個呼叫的背後隱藏的卻是多型呼叫,即step2和step3動態繫結了。看見,採用模板方法模式,

不僅定義了乙個演算法的骨架,而且把這個骨架的實現的細節作了進一步的封裝。我們可以在模板方法模式中可以這樣設計:

(1) 如果乙個函式作為演算法骨架中不可變更的一部分,那麼可以將此函式作為基類的私有函式,並且在基類的公共骨架函式中呼叫該函式,即該函式作為骨架的乙個

不可更改的實現細節。

(2) 如果乙個函式提供了演算法骨架某環節的乙個預設實現,那麼可以考慮將該函式作為基類的私有虛函式,表示子類可以改寫它,也可以不改寫它。

(3) 如果作為演算法骨架一部分某個函式要求在子類中擁有不同的實現,那麼可以考慮將該函式作為基類的保護(純)虛函式,表示子類必須改寫它。

講到這裡,已經差不多了,在結束的時候,提一下語法與語義的聯絡。通常,語法是表象,語義是表象後面隱藏的東西,而這些隱藏的語義往往更具有價值。

舉個例子,public繼承與private繼承在語法方面似乎沒有什麼更多的東西值得**,它們的區別僅僅在於改變了繼承得到的成員的可見性,但是從語義方面來分析,

它們就相差太遠了,private繼承在語義上來講是「通過基類來實現自己」,即是「實現繼承」,在這種繼承關係中,基類和子類的關係是很薄弱的;

而public繼承在語義上即是我們所熟知的「is-a」關係,它體現了基類和子類之間的親密性,也正是這種「is-a」關係為多型性提供了基礎。

所以,通過表面的語法來挖掘其背後的語義很有意義,就像這篇文章中提到的將訪問限定符與virtual結合起來的語法背後隱藏的語義,挖掘出這些語義,

對於我們以後在進行設計時作恰當的抉擇無疑是大有幫助的。

private的虛函式

3.1 private的虛函式 考慮下面的例子 class a private virtual void bar class b public a 在這個例子中,雖然bar 在a類中是private的,但是仍然可以出現在派生類中,並仍然可以與public或者protected的虛函式一樣產生多型的效...

private的虛函式

3.1 private的虛函式 考慮下面的例子 class a private virtual void bar class b public a 在這個例子中,雖然bar 在a類中是private的,但是仍然可以出現在派生類中,並仍然可以與public或者protected的虛函式一樣產生多型的效...

虛函式 純虛函式

一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...