C++ 基类和派生类中具有相同名称的静态成员变量 类基{ 静态std::矢量滤波器; 虚拟布尔检查(){ 如果(标准::查找(过滤器…) } } 派生类:公共基{ 静态std::矢量滤波器; bool check()覆盖{ 如果(标准::查找(过滤器…) } }

C++ 基类和派生类中具有相同名称的静态成员变量 类基{ 静态std::矢量滤波器; 虚拟布尔检查(){ 如果(标准::查找(过滤器…) } } 派生类:公共基{ 静态std::矢量滤波器; bool check()覆盖{ 如果(标准::查找(过滤器…) } },c++,c++11,C++,C++11,假设两个静态变量都以各自的平移单位定义 我有一个静态字符串向量,它在基类和派生类中携带相同的名称,因为它们旨在携带相同类型的信息,只是每个类的值不同。我知道为非虚拟函数隐藏名称不是一个好主意。这同样适用于静态成员变量吗?如果是的话,有什么替代方案 是的,所有避免隐藏非虚拟函数的原因都适用于(真空非虚拟)成员 我将假设派生中check()的重写在文本上与Base的重写相同 您可以改为使用具有静态局部变量的虚拟方法 class Base { static std::vector<std:

假设两个静态变量都以各自的平移单位定义


我有一个静态字符串向量,它在基类和派生类中携带相同的名称,因为它们旨在携带相同类型的信息,只是每个类的值不同。我知道为非虚拟函数隐藏名称不是一个好主意。这同样适用于静态成员变量吗?如果是的话,有什么替代方案

是的,所有避免隐藏非虚拟函数的原因都适用于(真空非虚拟)成员

我将假设派生中
check()
的重写在文本上与Base的重写相同

您可以改为使用具有静态局部变量的虚拟方法

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....))
   }
}
类基
{
// ...
virtual/*const?*/std::vector&filter()
{
静态标准::向量值=。。。
返回值;
}
bool check()//final
{
if(std::find(filter()…))
}
}
派生类:公共基
{
/*常量?*/std::vector&filter()//覆盖
{
静态标准::向量其他值=。。。
返回其他值;
}
}

您应该先问问自己,为什么子类中有
过滤器
成员。为什么不能使用基类中的那个?它们有不同的用途吗?或者它们基本上是存储相同(或相同类型)的数据?我在问题中说过,它们存储相同类型的数据!但是不同的值因为它们是只依赖于类的类型而不是类的实例的值,所以它们有不同的用途(据我所见和理解),我看不出有什么问题。这会让人困惑,但本质上并没有什么错。您可能希望重命名这两个变量,以便更好地适应每一个目的,以避免混淆。“我知道为非虚拟函数隐藏名称不是一个好主意”-您为什么这么说?在这种情况下会发生什么坏事?是的,我也想过这样做。只有在虚拟函数(check)中直接定义静态值才能起作用吗?这让你回到“必须在任何地方重复检查”problem@Robᵩ 在所有使用
filter
的地方使用
filter()
有什么问题?我的问题。我误读了你的密码。删除我的原始、无效、注释。
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;
    }
}