使用VC71編譯器並得到編譯器錯誤,我不明白。 這裏談到的例子覆蓋虛擬方法時編譯錯誤
class A
{
public:
virtual int& myMethod() = 0;
virtual const int& myMethod()const = 0;
};
class B: public A
{
public:
// generates: error C3241: 'const int &B::myMethod(void)' : this method was not introduced by 'A'
virtual int& A::myMethod();
// error C2555: 'B::myMethod': overriding virtual function return type differs and is not covariant from 'A::myMethod'
virtual const int& A::myMethod() const;
};
當i開關在B兩者方法定義的順序,然後我看到一個不同的編譯器錯誤:
class B: public A
{
public:
// error C3241: 'const int &B::myMethod(void)' : this method was not introduced by 'A'
virtual const int& A::myMethod() const;
// error C2556: 'int &B::myMethod(void)' : overloaded function differs only by return type from 'const int &B::myMethod(void)'
// error C2373: 'B::myMethod' : redefinition; different type modifiers
virtual int& A::myMethod();
// error C2555: 'B::myMethod': overriding virtual function return type differs and is not covariant from 'A::myMethod'
};
然而,如果我省略A::
東西然後我不得到任何編譯器錯誤:
class B: public A
{
public:
virtual int& myMethod();
virtual const int& myMethod() const;
};
所以,在我的方法名稱的前面究竟是什麼A::
,爲什麼我看到這些不同compil呃錯誤?任何解釋歡迎!
_你爲什麼把所有的A ::'放在你的代碼中?你想達到什麼目的?我不認爲我曾經在這種情況下使用過這種語法(這似乎是一個非常簡單的繼承)。 – 2010-04-07 13:56:47
@丹尼爾:我承認,我不知道,我在做什麼。我希望,如果有人會改變A中的虛擬方法名稱,那麼我會在B的覆蓋定義中看到編譯器錯誤。當省略A ::時,編譯器不知道我是否嘗試覆蓋A的方法或引入自己的方法,並且如果在A處不存在這樣的方法定義,則編譯器不會產生錯誤。這是否有意義? – 2010-04-07 14:06:19
如果您需要該功能,請使用C而不是C++。 :P – 2010-04-07 14:11:07