如果我有一個虛擬事件的以下重寫:C++基類::方法重寫一個虛函數
void derivedClass::method(event)
{
// my stuff
baseClass::method(event); // <--
}
請問// < ---線做了什麼?它叫什麼?我不認爲它會調用基類的方法,因爲它是虛擬的(所以沒有體)
如果我有一個虛擬事件的以下重寫:C++基類::方法重寫一個虛函數
void derivedClass::method(event)
{
// my stuff
baseClass::method(event); // <--
}
請問// < ---線做了什麼?它叫什麼?我不認爲它會調用基類的方法,因爲它是虛擬的(所以沒有體)
正如你所提出的建議,它調用基類的方法。它是虛擬的這一事實只意味着它可以被覆蓋,並仍然可以從指針/引用到基類訪問派生類的方法。
之所以這樣做,可以很容易地看到一個例子:
class Base {
public:
virtual void foo() {
/* do some generic stuff */
}
};
class Derived : public Base {
public:
void foo() {
/* do some specific stuff */
/* if you also want to do the generic stuff,
you can call the same method from the base class. */
Base::foo();
}
}
這可能是你不想做通用的東西爲Derived
類的情況。然後,您將刪除對Base::foo()
的呼叫。
在這裏,你有virtual methods一個很好的參考。
那麼哪種方法實際上會被調用?假設基礎上只有一個虛擬方法,並且上面的代碼爲派生類 – 2012-07-18 20:44:23
@JohnnyPauling首先,派生類中的方法將被調用。然後,由於顯式調用了基類的方法,該方法也會被調用。 – betabandido 2012-07-18 20:45:22
謝謝,現在很清楚 – 2012-07-18 20:45:50
它確實調用基類方法。是的,衍生的方法是被稱爲「多晶型」,但它可以調用使用Base::method
當合格名稱(<class name>::<method name>
)在一個類的方法調用時,該方法被直接調用其基部方法,非幾乎爲。在你的例子中,調用baseClass::method
。由於使用了限定名稱,因此方法是虛擬的這一事實意味着什麼都沒有,並且沒有任何區別。
對不起,我的意思是文本註釋 – 2012-07-18 20:42:10
是啊,我意識到之前和刪除 – mathematician1975 2012-07-18 20:42:25
一個成員函數是虛擬的,並不意味着它沒有定義。即使它是*純虛擬的*它可以有一個定義,並用該語法來調用。 – 2012-07-18 20:58:24