在以下示例中,为什么我无法在派生类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;
}
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
?
答案 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
};