C 子類對父類方法的覆蓋

2021-08-29 14:45:48 字數 1102 閱讀 2759

昨天看《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...

子類方法與父類方法

重寫 只能適用於例項方法.不能用於靜態方法.對於靜態方法,只能隱藏 形式上被重寫了,但是不符合的多型的特性 重寫 是用來實現多型性的,只有例項方法是可以實現多型,而靜態方法無法實現多型。只能說形式上靜態方法的卻可以被重寫,實際上達不到重寫的效果,從多型的角度可以認為子類實際上是寫了乙個新方法,從這個...