昨天看《c++高階程式設計》,其中講到了子類可以覆蓋父類中的私有方法。當時嚇了一跳,如果我用了乙個第三方的庫,繼承了裡面的某個類,自己寫了個私有方法都得慎之又慎,一不小心可就覆蓋了它的私有方法,誰知道會出現什麼稀奇古怪的錯誤!
今天寫點**試了下,發現私有方法是virtual時才能在子類中覆蓋。
#include using namespace std;
class p;
void p::showmeimpl()
void p::showme()
class c : public p;
void c::showmeimpl()
int main(int argc, char* argv)
輸出:here is the parent
here is the child
如果p中的showmeimpl不用virtual修飾,輸出就是期望的兩次here is the parent。
c++確定什麼時候呼叫哪個方法還是比較上腦筋的。加入子類c重寫了父類的showme方法。輸出here is the child。
p p;
c c;
p = c;
p.showme(); //方式1
不管子類和父類方法是否用virtual修飾,都會輸出here is parent。
c c;
p& p = c;
p.showme(); //方式2
p* p2 = &c;
p2->showme(); //方式3
這兩種方式,如果父類和子類的方法用virtual修飾,會呼叫子類方法。如果沒有用virtual修飾,會呼叫父類方法。
解釋:第二種和第三種方式,如果沒有用virtual,同樣直接硬編碼父類showme函式位址。用了virtual修飾後,會建立乙個虛擬表,包含了指向虛方法實現的指標,呼叫虛方法時會進入虛擬表以找到正確的實現。所以關於子類覆蓋父類私有方法的解釋是:呼叫showmeimpl是進入虛擬表找到子類的實現,所以輸出here is child。第一種情況我就不清楚了可能是引用和指標形式下,p和c在記憶體裡就是同乙個東西,使得它們的虛函式表位址一樣。
C 子類函式對父類同名函式的覆蓋
class b public void f int const cout b.int endl void f double const cout b.double endl class d public b public void f void const cout d.void endl int ...
c 子類物件呼叫父類的方法
第一種方式就是子類重寫父類的方法,在子類中定義和父類同樣的方法,方法體中呼叫父類的方法 父類 pragma once include cclientsocket.h class ctcpinte ce include ctcpinte ce.h include include include uti...
子類方法與父類方法
重寫 只能適用於例項方法.不能用於靜態方法.對於靜態方法,只能隱藏 形式上被重寫了,但是不符合的多型的特性 重寫 是用來實現多型性的,只有例項方法是可以實現多型,而靜態方法無法實現多型。只能說形式上靜態方法的卻可以被重寫,實際上達不到重寫的效果,從多型的角度可以認為子類實際上是寫了乙個新方法,從這個...