簡體   English   中英

枚舉繼承沖突

[英]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_VALUEBase::A_VALUE ,因此必須進行顯式轉換為基本類型才能訪問它。 不論常量性如何,這同樣適用於在類范圍內定義的其他名稱。

這是一個生動的例子

為什么這不會產生警告,取決於您正在使用的實現,但是可能會有一個可變的陰影警告可以涵蓋這種情況。 但是,該標准沒有警告的任何概念,因此對於您的特定編譯器為何不在此處沒有客觀答案(除非您向實現者發送消息並詢問)。

就像其他人所說的那樣,強類型枚舉(C ++ 11)不會出現這樣的問題,因為必須通過范圍解析運算符::來訪問它們,就像在名稱空間中定義常量一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM