單一繼承下基類private虛函式在派生類中能否訪問??
在使用者程式中,派生類物件的虛指標指向的虛函式表中是仍然有基類private虛函式的條目,但是由於屬性為private,無法實現正常的訪問!//
通過得到private虛函式的位址強制訪問說明其確實存在於子類的虛函式表中!
事實上,多型性與將實現多型的函式的訪問限定符沒有任何關係,private 函式仍然可以實現多型,它的指標仍然位於vtbl中;
只不過該函式的多型一般只能在基類的內部由其他非虛函式呼叫該函式的時候反映出來,
訪問限定符僅僅限制外部對類的成員的訪問許可權,它並沒有破壞以下規則:
通過基類指標或引用呼叫成員函式時,如果該函式時非虛的,那麼將採用靜態繫結,即編譯時繫結;如果該函式是虛擬的,則採用動態繫結,即執行時繫結。二、virtual與訪問限定符結合
派生類只有乙個虛函式表,派生類物件只有乙個虛指標來指向這個虛函式表。
虛函式表中按照基類虛函式(若派生類override基類的虛函式,則虛函式表中原先存放的基類虛函式的位址變為相應的派生的虛函式的位址)、派生類新增的虛函式順序依次排列。
class base
virtual void g()
private:
virtual void h()
};class derive:public base
virtual void g()
virtual void hh()
};typedef void (*fun)();
int main()
虛繼承和虛基類
虛繼承主要解決在多重繼承中的菱形繼承問題,也就是說 b和c類同時繼承了a類,然後d類繼承了b,c類,那麼d類的虛表就會有重複的函式指標。include using namespace std 虛基類 class person person person string name name name e...
虛基類和虛繼承
這算得上我個人的乙個總結上,其實也算不上什麼原創,只是為了過濾一下前輩的經驗,加深一下自己的記憶 虛繼承的目的是讓某個類做出宣告,承諾願意共享它的基類,被共享的那個基類就是虛基類 includeusing namespace std class a protected int a class b p...
多重繼承 虛繼承與虛基類
一 多重繼承 單重繼承 乙個派生類最多只能有乙個基類 多重繼承 乙個派生類可以有多個基類 class 類名 繼承方式 基類1,繼承方式 基類2,派生類同時繼承多個基類的成員,更好的軟體重用 可能會有大量的二義性,多個基類中可能包含同名變數或函式 多重繼承中解決訪問歧義的方法 基類名 資料成員名 或成...