无法访问继承的变量

Unable to access inherited variable

在下面的例子中,为什么我无法在派生的 class bar 中分配给继承变量 a

#include <iostream>

class foo
{
protected:
    int a;
};

class bar : public foo
{
public:
    bar(int _a) : a{_a} {}
    int GetA() const { return a; }
};

int main() {
    bar b{5};
    std::cout << b.GetA() << std::endl;
    return 0;
}

我收到 following compiler error:

prog.cpp: In constructor 'bar::bar(int)':
prog.cpp:12:16: error: class 'bar' does not have any field named 'a'
  bar(int _a) : a{_a} {}
                ^

我的 bar class 现在没有变量 bar::a 吗?或者它只能访问 foo:a?

您可以从派生的 class bar 访问 foo::a,但不能在构造函数的初始化列表中对其进行初始化。那只能直接初始化base class。因此,您应该

class foo
{
protected:
    foo(int _a) : a(_a) {}        // initialise member
    int a;
};

class bar : public foo
{
    int b;
public:
    bar(int _a) : foo{_a}, b(0) {}  // initialise base, then member
    int GetA() const { return a; }  // fine: access protected member of base
};

编译器是正确的。 class bar 没有任何数据成员。 parent 确实如此。

一个传统的方法是使用Parent class'构造函数:

class foo
{
  protected:
    foo(int value) : a(value)
    { ; }
    int a;
};

class bar : public foo
{
  public:
    bar(int value)
      : foo(value)
    { ; }
};

另一种方法是在构造函数中访问foo变量:

  bar(int value)
  {
    foo::a = value; // parent scope added for emphasis.
  }