无法访问继承的变量
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;
}
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.
}
在下面的例子中,为什么我无法在派生的 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;
}
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.
}