關於訪問限定符與虛函式的關係

2021-08-10 16:59:39 字數 685 閱讀 9574

結論:在子類宣告為private的虛函式,通過父類的引用仍然可以訪問該函式。

我們先看一段**:

#includeusing namespace std;

class a

};class b : public a

virtual void h()

};int main()

執行結果:

可見我們的結論是正確的。

個人解釋:

對於訪問的控制許可權,是編譯器強加於程式設計師,使我們的程式更加符合oo的規範。對於執行期間並不存在所謂的訪問控制許可權(我們只要得到了函式的指標就可以為(wei)所(suo)欲為。而虛函式屬於動態聯編,在執行期間得到函式指標,所以完全不受訪問許可權的控制。

另:之前一直困惑我的乙個問題

在子類中定義了虛函式(而父類中沒有定義),那該虛函式的指標應存在於vptr指向的vtbl中,而且vptr存放於物件記憶體的前4個位元組中(x86),按理說程式在執行期間,父類指標或引用可以從vtbl中找到該虛函式的,但事實上在編譯階段編譯器直接報錯,即編譯不通過。

以上的解釋也符合此情況,即在編譯期間,編譯器即已認定父類指標或引用中無此函式(父類怎麼會知道子類定義了那些函式呢

關於C const限定符與define

const限定符修飾的常量無法修改,且在定義的時候必須同時初始化,否則error xcode平台 相比define,const指定的常量有型別,而define只是簡單的字元替換。const修飾的常量只能由const指標來指向,不能用乙個普通的指標指向乙個const修飾的常量 const int a ...

C 常見訪問限定符的說明

上一節在類的建立中,提到了訪問限定符,但沒怎麼細說,我們就來研究一下 訪問限定符是用於指定成員或者型別的可訪問性的關鍵字。public 修飾的成員在類外可以被直接訪問 private 修飾的成員在類外不能被直接訪問 protected 修飾的成員在類外不能被直接訪問 此處的private 和prot...

關於C 的const限定符的學習

c 程式設計中鼓勵用const來進行常量的定義不鼓勵使用巨集,但是在底層程式設計中用巨集很方便。在這裡總結了一點關於const的一些研究。const會進行型別檢查,而巨集只是簡單的替換。const的作用域是該變數的作用域範圍。const在編譯的時候分配記憶體。巨集是在預處理的時候進行替換。const...