无法访问继承的变量

时间:2015-02-06 23:19:08

标签: c++ oop inheritance

在以下示例中,为什么我无法在派生类a中分配继承变量bar

#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课程现在有变量bar::a吗?或者它只能访问foo:a

2 个答案:

答案 0 :(得分:3)

编译器是正确的。班级bar没有任何数据成员。它的父母呢。

传统的方法是使用父类&#39;构造函数:

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.
  }

答案 1 :(得分:2)

您可以从派生类foo::a访问bar,但不能在构造函数的初始化列表中初始化它。这只能直接初始化基类。因此,您应该

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
};