我有一个母班和一个派生的女儿班。我正在尝试访问受保护的变量' familystuff'在派生类中。我尝试访问它的两种方式都不起作用。当我编译并运行它时,我得到以下输出:
5 3 1
1
Familie 32768
FOO 32767
class Mother
{
private:
int motherstuff;
protected:
int familystuff;
public:
int everyonesstuff;
void SetStuff(int a, int b, int c){
motherstuff = a;
familystuff = b;
everyonesstuff = c;
}
void Show(){
cout << motherstuff << " " << familystuff << " " <<everyonesstuff << endl;
}
};
class Daughter : public Mother
{
public:
Daughter()
{
a = familystuff + 1;
}
void Show(){
cout << "Familie " << a << endl;
}
int foo() { return familystuff;}
private:
int a;
};
int main(){
Mother myMum;
myMum.SetStuff(5,3,1);
myMum.Show();
cout << myMum.everyonesstuff << endl;
Daughter myDaughter;
myDaughter.Show();
cout << "FOO " << myDaughter.foo() << endl;
}
答案 0 :(得分:2)
在面向对象编程中没有明确的概念。当您创建两个对象时,它们彼此完全不同。在他们被迫之前,他们不会互相交流。所以,
myDaughter
和familystuff
是单独的对象,并且不会共享其变量的值。int main()
{
Daughter myDaughter(5,3,1);
myDaughter.Show();
cout << "FOO " << myDaughter.foo() << endl;
}
因此,如果要从派生类访问受保护的成员,则需要编写以下内容:
Daughter(int x,int y,int z)
{
SetStuff(x,y,z);
a = familystuff + 1;
}
将Daughter的构造函数更改为以下内容:
Link_a = set(['a','b','c'])
您将获得所需的输出!!
答案 1 :(得分:1)
这里有几个问题:
myDaughter
和myMum
是不同的对象。你暗示他们之间存在某种关系,但没有。
您的代码有未定义的行为,因为您的Daughter
构造函数在添加操作中使用了未初始化的成员变量familystuff
。
您应该初始化您的数据成员,如下所示:
Mother::Mother() : motherstuff(0), familystuff(0), everyonesstuff(0) {}
Daughter::Daugher() : a(familystuff + 1) {}