2011-06-17 45 views
3

Possible Duplicate:
Overriding a Base's Overloaded Function in C++C++虛函數問題

我有這樣一類這個一個:

class Object { 
public: 
    int alignment() const; 
    virtual void alignment(int i); 
}; 

,我試圖子類是這樣的:

class Sub : public Object { 
public: 
    virtual void alignment(int i); 
}; 

則:

Sub *sub = new Sub(); 
sub->alignment(10); 
int a = sub->alignment(); 

T他編譯器(鏗鏘1.0)產生一個錯誤:「函數調用的參數太少,預期1,有0。」我不明白爲什麼帶有參數的虛擬函數與非虛擬const函數混淆。有人可以解釋爲什麼嗎?

+0

看到這個:http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c/888313#888313 –

+0

@Fred拉爾森這只是我正在尋找的解釋,謝謝! – joshfisher

回答

3

是的。像這樣做隱藏了基類中的函數重載。以下內容添加到您的Sub類解決這個問題:

using Object::alignment; 
+0

這樣做的時候,我得到一個關於對vtable未定義引用的錯誤。見[這裏](http://ideone.com/XoqPN)。 –

+0

允許重載的成員函數是虛擬的嗎? – Mahesh

+1

@Space:您需要定義功能 –

-2

int a = sub> alignment();

您沒有在預期的參數中指定參數。

+1

男孩,很多人在沒有閱讀這個問題上回答問題 –

+1

好吧,狗屎。你讓我在那裏。 – MGZero

1

在我看來,下面的操作意圖更加清晰:
int a = sub->Object::alignment();

而且你沒有指定公共關鍵字,如Space_C0wb0y前面提到的

+1

這確實是另一種解決方案。但我不能認同這一點更清楚! –

3

名稱查找不會按照您認爲的方式工作。

編譯器開始於Sub,並查看它是否具有名爲alignment的函數。它確實...所以它停止尋找。它甚至不會考慮父類,因爲它已經找到了匹配。因此Sub中的虛擬覆蓋隱藏了Object中的非虛函數。不幸的是,這種匹配需要一個整體參數,而你沒有提供。

請注意,即使Object中的alignment功能都是虛擬的,也不會改變。通過覆蓋一種方法,您可以隱藏所有其他版本。

要修復此問題,請在Sub範圍內提供使用聲明,以便將其他函數納入範圍,以便名稱查找將找到兩個版本。