在派生构造函数中访问基本成员时出现问

时间:2010-06-01 06:08:18

标签: c++ inheritance constructor

鉴于以下类别:

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这一事实有关吗?

2 个答案:

答案 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构造函数