2013-05-12 85 views
4

我感到困惑關於下面的代碼編譯器錯誤:困惑虛擬重載函數

class Base { 
public: 
    virtual ~Base() { } 
    virtual void func() { } 
    virtual void func (int) { } 
    virtual void another() { } 
    virtual void another (int) { } 
}; 

class Derived : public Base { 
public: 
    void func() { } 
}; 

int main() { 
    Derived d; 
    d.func(); 
    d.func(0); 
    d.another(); 
    d.another(0); 
} 

使用gcc 4.6.3,上面的代碼導致在d.func(0)說Dervied ::錯誤func(int)未定義。

當我還將func(int)的定義添加到Derived時,它就可以工作。當我在Derived中既不定義func()也不func(int)時,它也起作用(就像「另一個」的情況一樣)。

很明顯,有一些規則有關虛擬重載函數會在這裏,但是這是我第一次遇到它,我不太明白。有人能告訴我究竟發生了什麼嗎?

回答

11

當您在Derived中覆蓋func()時,此隱藏func(int)

gcc可以提醒你一下:

$ g++ -Wall -Woverloaded-virtual test.cpp 
test.cpp:5:16: warning: 'virtual void Base::func(int)' was hidden [-Woverloaded-virtual] 
test.cpp:12:8: warning: by 'virtual void Derived::func()' [-Woverloaded-virtual] 

您可以using解決這個問題:

class Derived : public Base { 
public: 
    using Base::func; 
    void func() { } 
}; 

對於爲什麼發生這種情況的討論,參見Why does an overridden function in the derived class hide other overloads of the base class?

+1

嘿感謝! !關於-Woverloaded的提示虛擬和修復功能非常有用;我甚至不知道我有過的問題的絕佳答案。 :-) – 2013-05-12 07:34:51