[英]Enum inheritance conflict
假設在其頭文件中有一個定義如下枚舉的基類:
class Base{
public:
Base();
enum MyEnum1{
A_VALUE=1,
B_VALUE=2
};
};
派生類在不同的枚舉中定義相同的變量,但具有不同的值:
class Derived : public Base{
public:
Derived();
enum MyEnum2{
A_VALUE=3,
B_VALUE=4
};
};
顯然我犯了一個錯誤,因為我沒有注意到基類中已經定義了A_VALUE和B_VALUE。 然后,我在派生類實現中使用了這些值。 為什么編譯器(Visual Studio 2013)沒有警告我該值存在沖突? 我可以認為我使用的是MyEnum2的值而不是MyEnum1,反之亦然。
給出以下代碼:
#include <iostream>
class Base
{
public:
enum MyEnum1
{
A_VALUE = 1,
};
const int B_VALUE = 42;
int C_VALUE = -2;
};
class Derived : public Base
{
public:
enum MyEnum2
{
A_VALUE = 3,
};
const int B_VALUE = 180;
int C_VALUE = 99;
void test()
{
std::cout << A_VALUE << ' ';
std::cout << static_cast<const Base*>(this)->A_VALUE << ' ';
std::cout << B_VALUE << ' ';
std::cout << static_cast<const Base*>(this)->B_VALUE << ' ';
std::cout << C_VALUE << ' ';
std::cout << static_cast<const Base*>(this)->C_VALUE << std::endl;
}
};
int main()
{
Derived instance;
instance.test();
}
3 1 180 42 99 -2
將被打印。
這是因為標識符Derived::A_VALUE
了Base::A_VALUE
,因此必須進行顯式轉換為基本類型才能訪問它。 不論常量性如何,這同樣適用於在類范圍內定義的其他名稱。
為什么這不會產生警告,取決於您正在使用的實現,但是可能會有一個可變的陰影警告可以涵蓋這種情況。 但是,該標准沒有警告的任何概念,因此對於您的特定編譯器為何不在此處沒有客觀答案(除非您向實現者發送消息並詢問)。
就像其他人所說的那樣,強類型枚舉(C ++ 11)不會出現這樣的問題,因為必須通過范圍解析運算符::
來訪問它們,就像在名稱空間中定義常量一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.