鉴于以下类别:
class foo
{
private:
int c;
public:
foo( int a = 42 ) { c = a; }
~foo();
};
class bar: public foo
{
public:
bar();
~bar();
};
如何使用不同的号码栏覆盖 c ?我可以这样做吗?
bar::bar()
{
c = 12;
}
尝试编译时出现此错误:
test.cpp:在构造函数
‘bar::bar()’
中:
test.cpp:8:7:错误:‘int foo::c’
是私有的
答案 0 :(得分:5)
在构造函数初始化列表中调用基类的构造函数:
bar::bar()
: foo(12)
{ }
顺便提一下,你应该总是更喜欢在构造函数体内使用构造函数初始化列表,因此你的foo
构造函数会更好地写成:
foo( int a = 42 ) : c(a) { }
答案 1 :(得分:1)
调用基类构造函数:
bar::bar() : foo(12) { }
编辑:哎呀
答案 2 :(得分:1)
您应该为私有变量使用getter和setter方法。
所以你的电话foo应该是这样的:
class foo
{
private:
int c;
public:
foo( int a = 42 ) { c = a; }
virtual ~foo();
void setC (int tempC){
c=tempC;
}
int getC() const{
return c;
}
};
在B的构造函数中,您可以将它们称为setter方法:
bar::bar()
{
setC(12);
}
然后,您应该始终使用setter和getter方法来访问变量,而不是直接访问它。
您还应该声明基类的析构函数是虚拟的。
答案 3 :(得分:0)
怎么样?
bar::bar() : foo(12) {}