覆盖子类中的公共静态const成员

时间:2017-12-06 15:28:25

标签: c++ static override parent-child public

我有一段我不确定的工作代码。请参阅下面的模拟版本。它的主旨是我有一个Foo类,一个ChildFoo类和Bar类,其实例为FooFoo提供了Bar解析json字典的一些键。 Bar是通用的,并以多种方式使用,Foo是每个实现的子类。

我在public static const std::string中有Foo,默认为"",在这种情况下,解析值的Bar方法只使用自己的名称而不是特定的名称键。我在PARAM_VALUE中覆盖ChildFoo,因为它的json字典更复杂并且提供{value: [], type:[], ...},而其他实现只返回{mName: []}

foo.h中:

class Foo
{
public:
    static const std::string PARAM_VALUE;
}

Foo.cpp中:

const std::string Foo::PARAM_VALUE = "";

Foo::Foo ()
{
...
}

ChildFoo.cpp:

const std::string Foo::PARAM_VALUE = "value";

ChildFoo::ChildFoo() : Foo()
{
...
}

Bar.h

class Bar
{
private:
    std::string mName;
    ChildFoo * mFoo;
}

Bar.cpp:

Bar::Bar ()
{
...
}

int Bar::parseValue ()
{
    std::string key;
    if (!mFoo->PARAM_VALUE.empty()) {
        key = mFoo->PARAM_VALUE;
    }
    else {
        key = mName;
    }
    ...
}

我认为我必须沿着虚拟吸气剂的路线前往这些钥匙,但我想我会试试这个并且稍微惊讶地发现它有效。在考虑它时,我认为它有效,因为Foo::PARAM_VALUE在编译时被ChildFoo覆盖,因此const在此时不具有限制性。但我并不完全确定。

这是否有效并不令人惊讶?这被认为是好的吗?以这种方式做事有什么缺点吗?

干杯, 加里

1 个答案:

答案 0 :(得分:1)

我不相信你的链接器会允许这样做,如果确实存在,行为肯定是不确定的。

您的代码违反了一个定义规则

如果需要,可以使用变量阴影,但请记住,这不是多态的。如果你想要多态,那么你需要使用虚函数。