2012-07-18 24 views
1

如果我有一個虛擬事件的以下重寫:C++基類::方法重寫一個虛函數

void derivedClass::method(event) 
{ 

    // my stuff 

    baseClass::method(event); // <-- 

} 

請問// < ---線做了什麼?它叫什麼?我不認爲它會調用基類的方法,因爲它是虛擬的(所以沒有體)

+0

對不起,我的意思是文本註釋 – 2012-07-18 20:42:10

+0

是啊,我意識到之前和刪除 – mathematician1975 2012-07-18 20:42:25

+1

一個成員函數是虛擬的,並不意味着它沒有定義。即使它是*純虛擬的*它可以有一個定義,並用該語法來調用。 – 2012-07-18 20:58:24

回答

2

正如你所提出的建議,它調用基類的方法。它是虛擬的這一事實只意味着它可以被覆蓋,並仍然可以從指針/引用到基類訪問派生類的方法。

之所以這樣做,可以很容易地看到一個例子:

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一個很好的參考。

+0

那麼哪種方法實際上會被調用?假設基礎上只有一個虛擬方法,並且上面的代碼爲派生類 – 2012-07-18 20:44:23

+0

@JohnnyPauling首先,派生類中的方法將被調用。然後,由於顯式調用了基類的方法,該方法也會被調用。 – betabandido 2012-07-18 20:45:22

+0

謝謝,現在很清楚 – 2012-07-18 20:45:50

1

它確實調用基類方法。是的,衍生的方法是被稱爲「多晶型」,但它可以調用使用Base::method

1

合格名稱(<class name>::<method name>)在一個類的方法調用時,該方法被直接調用其基部方法,非幾乎爲。在你的例子中,調用baseClass::method。由於使用了限定名稱,因此方法是虛擬的這一事實意味着什麼都沒有,並且沒有任何區別。