2016-12-08 51 views
0
class Base { 
    static std::vector<std::string> filter; 

    virtual bool check() { 
     if(std::find(filter....)) 
    } 
} 

class Derived : public Base { 
    static std::vector<std::string> filter; 

    bool check() override { 
     if(std::find(filter....)) 
    } 
} 

假設兩個靜態變量都在其各自的翻譯單元中定義。在基類和派生類中具有相同名稱的靜態成員變量

我有靜態字符串的向量攜帶在基座相同的名稱和派生類,因爲它們是打算進行相同類型的剛具有每個等級的不同值的信息的。我知道非虛擬函數的名稱隱藏不是一個好主意。這同樣適用於靜態成員變量嗎?如果是的話有什麼選擇?

+3

你或許應該開始問自己,爲什麼* *您必須在子類的'filter'成員。爲什麼你不能使用基類中的那個?他們是爲了不同的目的?還是他們基本上存儲相同(或相同類型)的數據? –

+0

我在問題中說過,他們存儲的是同一種數據!但不一樣的價值觀 – mkmostafa

+0

,因爲它們只依賴於類的類型,而不是類 – mkmostafa

回答

0

是,所有同樣的原因,以避免遮蔽非虛函數應用於(空洞地非虛擬)成員;

我要去假設的check() Derived中的覆蓋在文字上完全相同基地。

您可以改用虛擬方法與靜態當地人

class Base 
{ 
    // ... 

    virtual /*const?*/ std::vector<std::string> & filter() 
    { 
     static std::vector<std::string> value = ... 
     return value; 
    } 
    bool check() // final 
    { 
     if(std::find(filter()...)) 
    } 
} 

class Derived : public Base 
{ 
    /*const?*/ std::vector<std::string> & filter() // override 
    { 
     static std::vector<std::string> otherValues = ... 
     return otherValues; 
    } 
} 
+0

是啊,我想同樣做。只有在虛擬函數(check)中直接定義靜態值才能起作用? – mkmostafa

+0

,讓你回到「有重複檢查的身體到處過濾器不同」的問題 – Caleth

+0

@Stargateur好點。大概過const的,好措施 – Caleth

相關問題