一般我們說虛函式,它的訪問級別都是public的,用類物件可以直接呼叫,這樣就可以實現執行時的型別繫結,那如果我們將虛函式私有化會出現什麼情況呢?
我們先來看乙個非虛函式私有化的例子
class在main函式裡產生乙個derived的物件d,然後呼叫print()函式,即d.print(),結果輸出的卻是base,print()函式沒有呼叫子類的printclassname函式,而是呼叫父類的printclassname函式,原來是由於printclassname函式不是虛函式之故,所以base的print()函式呼叫printclassname()函式是在編譯時就已經繫結了,而不是執行期繫結。base
public
:
void
print()
};class derived : public
base
};
下面我們讓printclassname()函式變成虛函式再執行,就可以看到輸出的類名為子類的名稱,即derived。
那麼我們有沒有辦法呼叫私有的虛函式呢?當然是有的,不管公有還是私有,只要是虛函式,它的函式位址都會放在虛函式表vftable中,只要我們找到虛函式表中存放的printclassname()函式的位址,我們就可以直接呼叫,前提是你必須對c++類物件的記憶體布局要熟悉,**如下,這樣也輸出derived,與前面效果相同
int _tmain(int argc, _tchar*argv)
C 之private虛函式
一般我們說虛函式,它的訪問級別都是public的,用類物件可以直接呼叫,這樣就可以實現執行時的型別繫結,那如果我們將虛函式私有化會出現什麼情況呢?我們先來看乙個非虛函式私有化的例子 class base public void print class derived public base 在mai...
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的虛函式一樣產生多型的效...