2012-02-27 55 views
0

具有相同名稱作爲基類創建一個功能我有一個要求,如下例:如何派生

class Base 
{ 

public: 
Base() { cout << "Base Class Constructor";} 
virtual ~Base() { cout << "Base Class Destructor";} 
}; 

class Der : public Base 
{ 
public: 
    Der() { cout << "Der Class Constructor";} 
    ~Der() { cout << "Der Class Destructor";} 
    void Base() {cout << "Der Class function";} 
}; 

int main(int argc, char* argv[]) 
{ 
    Base *ptr = new Der(); 
    ptr->Base(); // throwing error here - "Invalid use of class Base". My intention is to call Der::Base() function. 
    return 1; 
} 

請任何一個建議我打電話功能的方式「空基地()」,宣佈在Der類中通過指向Der對象的Base指針。

IDE:Qt Creator的 操作系統:Ubuntu的10.10 編譯器:GCC(X86)

回答

1

具有相同名稱的成員函數作爲基類是品味極差,容易出錯(使代碼不可讀人類)。你確定你無法避免嗎?

一個常見的約定是類名以大寫字母開頭,成員函數以小寫字母開頭。如果你遵循這個慣例,你將不會像你一樣受到傷害!

如果你真的堅持,你可以嘗試

(static_cast<Der*>(ptr))->Base(); 

一個更安全的方式也能像

{ Der* derptr = dynamic_cast<Der*>(ptr); 
    if (derptr) 
     derptr->Base(); 
    } 

但實際上,你應該避免編碼這種無感到代碼的東西。您的代碼變得不可讀,而且會傷害你,甚至在幾個星期...

不要忘了g++ -Wall -g編譯代碼(改善它,直到你沒有編譯警告),並使用gdb調試器調試它。不要忘記用<< endl來結束輸出語句。

你的代碼還有其他錯誤。它不編譯,即使main保持爲空

+0

嗨巴西爾,感謝您的快速回復。這解決了我的問題。 – user1235206 2012-02-27 10:20:50

+0

但我不認爲這解決了你的誤解......你真的應該避免這種情況。如果這是一項家庭作業,由於誤解和糟糕的編碼慣例(使您的代碼無法讀取,即使對您的老師而言),它也值得評分不好。 – 2012-02-27 10:23:50

+0

再次感謝。我確實遵循編碼慣例,以至於我從未遇到過這種情況。 – user1235206 2012-02-27 10:30:09