我知道有些人認爲我不應該從繼承類重新定義非虛函數,但是我現在所做的就是使用這種非常角色遷移的概念,而且它非常適合相當特殊的情況。調用已重新定義的基類非虛函數?
我想是這樣的(哦,這是C++):
class A {
public:
void f() { doSomethingA(); }
};
class B : public A {
public:
void f() { A::f(); doSomethingB(); }
};
然而,當我這樣做,A::f
被稱爲與this == 0
,這顯然會導致段錯誤。我做錯了什麼,或者這是不可能的?我目前的選擇是訴諸靜態函數,並明確傳遞對象,但我更喜歡這種方式。
是的,我可以以不同的方式對它們進行調用,但是這樣做會使它們看起來與程序員相似。我不能讓它們因爲各種原因而變得虛擬(最突出的是角色遷移,實際上我需要不同的行爲,這取決於我使用它的方式)。
任何幫助表示讚賞
編輯
謝謝大家的回答,看來我已經在我的構建環境時的錯誤迷迷糊糊的,最小的測試用例細跑;轉向優化也是如此。我想我可以在問這個問題之前嘗試過,但我通常認爲我做錯了什麼。
沒什麼可在這裏看到,沿着移動..很抱歉給您帶來不便... :)
您的'B'不會從'A'繼承...錯字?除此之外,這段代碼實際上應該可以工作。 – 2010-11-03 15:15:47
@Konrad;是的,錯字,對不起。 – falstro 2010-11-03 15:18:09
@Konrad;我仔細檢查了一下,代碼中沒有輸入錯誤,但是我正在盯着gdb中的調用堆棧,它明確指出了'B :: f(this = 0xffbfdb40)'後面跟着'A :: f(this =爲0x0)'。 – falstro 2010-11-03 15:27:05