乙個繼承錯誤

2022-01-23 19:37:19 字數 1080 閱讀 6340

今天在寫乙個類的繼承,在除錯的時候,虛函式的特點並沒有體現出來,讓我很是不解,用了兩個編譯器,結果都是一樣的。

類的**是這樣的:

1

#ifndef classbrass_h_included

2#define classbrass_h_included

3 #include 4 #include 5

6using

namespace

std;7//

extern int a;

8class

brass9;

29//

inheritance of brass

30class brassplus:public

brass31;

50#endif

//classbrass_h_included

brass是基類,brassplus是派生類。大家可以觀察一下22行和41行的**,你會發現一點區別。除了virtual外,那就是乙個宣告了const,而在派生中並沒有這個const。

我之前的測試的是用brass的指標指向brassplus的類,然後用brass的指標呼叫brassplus修改了的成員函式,也就是viewaccount()。按照書上(c++ primer plus,p449)中所講,編譯器對虛方法使用動態聯編,在程式執行時才能確定物件的型別。在main函式中我建立乙個brass指標和brassplus物件,然後用brass指標指向brassplus物件。就是這樣

1

intmain()

2

然後用那個指標呼叫viewaccount()函式。預期結果應該是使用派生類的函式,而結果卻是基類的函式。很簡單的乙個類的測試在這出現了問題。

出錯的原因就是因為派生類中viewaccount()函式沒用宣告為const型別。因為缺少這個const,編譯器並沒有將基類的viewaccount函式視為派生類viewaccount()函式的虛方法。所以,在使用bt->viewaccount()時,用的就是基類的函式,而不是派生類的。因為同名且不是虛方法,會被基類的函式遮蔽掉。

細節決定成敗。

若有錯誤,請指正,將非常感謝。

類的繼承中的乙個錯誤

基類 templateclass mstack 派生類1 template class s1 public mstack 派生類2 templateclass s2 public mstack 兩個派生類都實現了基類的虛函式,結果出現編譯錯誤 error c2995 bool mstack mpus...

乙個經典錯誤

今天,在學習qt tutorial 8的時候,犯了乙個經典錯誤,在建構函式裡面覆蓋了 應該是這樣稱呼這種行為的吧 私有成員變數,導致私有成員變數沒有初始化,引起懸空指標,導致程式崩潰。出錯 如下 lcdrange.h ifndef lcdrange h define lcdrange h inclu...

乙個邏輯錯誤。

程式設計師可能打算在這個語句列印0 1 2,但實際上它列印0 1 2 3。語義錯誤不是由編譯器捕獲,並可以有任意數量的影響 他們可能不會出現在所有,使程式產生錯誤的輸出,引起不正常的行為,破壞資料,或導致程式崩潰。它在很大程度上,我們關心的是語義錯誤。語義錯誤可以用許多方式發生。最常見的一種語義錯誤...