鉴于以下类别:
class Foo
{
struct BarBC
{
protected:
BarBC(uint32_t aKey)
: mKey(aKey)
mOtherKey(0)
public:
const uint32_t mKey;
const uint32_t mOtherKey;
};
struct Bar : public BarBC
{
Bar(uint32_t aKey, uint32_t aOtherKey)
: BarBC(aKey),
mOtherKey(aOtherKey) // Compile error here
};
};
我在指示的位置收到编译错误:
error: class `Foo::Bar' does not have any field named `mOtherKey'.
任何人都能解释一下吗?我怀疑这是一个语法问题,因为我在Bar
类中定义了Foo
类,但似乎无法找到解决方法。
这是简单的公共继承,因此mOtherKey
应该可以从Bar
构造函数访问。正确?
或者它与mOtherKey
是const并且我已经在0
构造函数中将其初始化为BarBC
这一事实有关吗?
答案 0 :(得分:8)
您不能通过成员初始化列表初始化基类的成员,只能直接和虚拟基类以及类本身的非静态数据成员。
将其他参数传递给基类的构造函数:
struct BarBC {
BarBC(uint32_t aKey, uint32_t otherKey = 0)
: mKey(aKey), mOtherKey(otherKey)
{}
// ...
};
struct Bar : public BarBC {
Bar(uint32_t aKey, uint32_t aOtherKey)
: BarBC(aKey, aOtherKey)
{}
};
答案 1 :(得分:1)
你无法做到这一点,因为BarBC构建了mOtherKey - 你无法覆盖它。
您已分配新值:
Bar(...) : ...
{ mOtherKey=aOtherKey; }
或者创建一个参数为mOtherKey
的其他BarBC构造函数