2015-04-14 26 views
0

我完全知道,我要告訴你的語法是調用例如派生類中的基類方法。但是在我遇到的一些代碼中,在類實現之外使用了相同的語法,我想知道這是否是合法的(在標準C++意義上)結構,以及結果行爲是否已定義好?從非派生代碼調用基本方法,這可能嗎?法律?

class Base 
{ 
public: 
    virtual void method(int arg) 
    { 
     ... 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void method(int arg) 
    { 
     ... 
     Base::method(arg); // I'm fully comfortable with this... 
    } 
}; 


int main(int argc, char* argv[]) 
{ 
    Derived d; 
    Derived* pD = &d; 
    pD->Base::method(2); // is this allowed? 
    ... 
+3

是的,它是允許的。 – Meixner

+0

每次你認爲某件事情不應該是合法的,因爲它是「錯誤的」,請記住,在大多數情況下,C++規則是「相信程序員」:如果程序員錯了,程序員不會這樣做。請記住,如果你真的生氣了,你可以對對象實例「memset」:-D ...如果事情不可能不自覺地發生,就沒有必要禁止它。 – 6502

回答

3

法律,是的,但它顯示了嚴重的錯誤設計。在這種情況下,一個類(Derived)應該提供一個完整的接口,不管它是具體的還是繼承的,並且不會強迫它的調用者深入研究它的膽量。如果Derived客戶可以合理需要調用Base::method而不是Derived::method,然後Derived應該提供一個公共的方法來提供該功能:

void alternateMethod(int arg) {Base::method(arg);} 

當然,如果你真的需要調用Base::method並不能改變Derived(遺留代碼或一個設計不好的外部圖書館),你可能別無選擇,只能使用該技巧。

總結並回答您的具體問題:是的,這是一個法律框架,是的,它的行爲是明確的。但重新設計Derived會好很多。

+0

謝謝你的回答。設計是一回事,但是能夠側開班級的虛擬桌面的能力,卻不是我以前見過的。 –

相關問題