我有一段我不确定的工作代码。请参阅下面的模拟版本。它的主旨是我有一个Foo
类,一个ChildFoo
类和Bar
类,其实例为Foo
。 Foo
提供了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
在此时不具有限制性。但我并不完全确定。
这是否有效并不令人惊讶?这被认为是好的吗?以这种方式做事有什么缺点吗?
干杯, 加里
答案 0 :(得分:1)
我不相信你的链接器会允许这样做,如果确实存在,行为肯定是不确定的。
您的代码违反了一个定义规则。
如果需要,可以使用变量阴影,但请记住,这不是多态的。如果你想要多态,那么你需要使用虚函数。