1樓:網友
先宣告一下,個人意見而已。
其實語言的實現在cpu來說是沒有能力區別的,cpu只是知道 位址,二進位 等等。而一切語言的特性是人為規定的,而且是由編譯器來限制的,並不是說是因為cpu或電路板上就規定了。所以說,你要嚴格去遵循語言標準,並同時參考編譯器的特性。
對於你說的這個,c++裡面叫多型,多型的性質就是規定了在編譯時不去進行判斷類的具體情況,也就是不去硬編碼,而是在執行時決定是基類還是派生類,到時候才會決定呼叫哪乙個的方法。
所以,你傳給函式myfun()的引數肯定是在執行時具體確定是哪乙個類,如果這樣的話,那麼你傳的是子類,它就會呼叫子類的方法。至於你說子類的方法是私有的,那就是編譯器的實現問題了,我估計它是沒有檢驗子類的重寫函式的私有性質,只是返回值、名稱、引數一致就通過了。但是它肯定檢測基類的了,不信你試試將基類的虛擬函式寫成私有的,肯定執行報錯。
所以我只能告訴你,這就是語言的標準和編譯器的實現問題,否則你說是遵循多型的定義標準好呢還是遵循私有性好呢?這在編譯器實現時是個困難的抉擇吧!
2樓:網友
這是由於虛擬函式和動態繫結機制。首先base中的 fun()函式是虛擬函式,那麼son中的fun()函式。
也成了虛擬函式。如果你去掉base中的virtual,則打出來的都是base。
通過物件呼叫虛擬函式時,是通過虛擬函式表的指標(由編譯器為帶有虛擬函式的類加上的。
一項成員變數)找到虛擬函式表,再找到虛擬函式的真正位址。
虛擬函式表的內容是根據類中的虛擬函式宣告次序,一一填入函式指標。派生類會繼承基類。
將不再是基類的函式位址,而是派生類的位址。由於你在myfun(s)中用的是base的。
派生類,所以呼叫的是改變後的fun()位址,打出son1。
派生類的物件對它的基類成員中( )是可以訪問的。
3樓:假面
派生類的物件對它的基類成員。
中(a、公有整合的公有成員)是可以訪問專的。
只要是派生類,都可屬以叢基類中繼承,除非把基類的建構函式定義為私有的,這樣派生類無法構造。
在類的層次設計中,可以發現一些普遍的特性,即派生類總是同基類有「kind of」關係。另乙個值得注意點是book既是派生類,也是基類。
C 的基類如何訪問其派生類的成員變數
直接訪問靜態變數肯定不行,但可以變通一下,通過虛擬函式獲得這個內靜態變數 給你個容例子,這樣是不是滿足你的要求?但這樣的話,每個繼承類都要做2件事 1.定義靜態變數 2.重寫虛擬函式,返回自己的靜態變數 這2件事可以通過巨集來做。mfc好象就是這麼幹的 include class a class b...
基類派生類的同名成員變數覆蓋問題
你的理解基本很對了。基類的那個print只能訪問基類的 a,訪問不到派生類的 a的。是這個意思,可以再看看虛擬函式的相關內容可能能理 回解更深刻一些。答 c 派生類成員覆蓋基類成員的問題 include using namespace std class a a a void a print cla...
C中,派生類的成員函式呼叫基類的受保護成員
不是很來清楚你的意圖 自 但是在c 中派生類的成員函式bai 是可以直接呼叫基類du的zhi受dao保護成員的。set staff modification 傳一個基類的引用,就可以在set中直接修改資料,而不是修改拷貝了。但是在基類中,你得把部門,名字,考勤情況等設定為protected.發上來看...