在派生 class c++ 中访问受保护的变量
access protected variable in derived class c++
我有一个母亲 class 和一个衍生女儿 class。我正在尝试访问派生 class 中的受保护变量 'familystuff'。我尝试访问它的两种方式都不起作用。当我编译并 运行 它时,我得到以下输出:
5 3 1
1
家庭 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;
}
这里有几处错误:
myDaughter
和 myMum
是 不同的对象 。你暗示他们之间有某种关系,但是有none.
您的代码有 未定义的行为,因为您的 Daughter
构造函数在加法运算中使用了未初始化的成员变量 familystuff
。
你应该像这样初始化你的数据成员:
Mother::Mother() : motherstuff(0), familystuff(0), everyonesstuff(0) {}
Daughter::Daugher() : a(familystuff + 1) {}
你对面向对象的编程没有一个清晰的概念。当您创建两个对象时,它们将彼此完全不同。在 forced.So、
之前,他们不会相互交流
myMum
和 myDaughter
是独立的对象,它们不共享变量的值。
- 最后两个输出基本上是垃圾值。你还没有初始化 myDaughter 的
familystuff
因此,如果您想从派生 class 访问受保护的成员,您需要编写以下内容:
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;
}
你会得到想要的输出!!
我有一个母亲 class 和一个衍生女儿 class。我正在尝试访问派生 class 中的受保护变量 'familystuff'。我尝试访问它的两种方式都不起作用。当我编译并 运行 它时,我得到以下输出:
5 3 1
1
家庭 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;
}
这里有几处错误:
myDaughter
和myMum
是 不同的对象 。你暗示他们之间有某种关系,但是有none.您的代码有 未定义的行为,因为您的
Daughter
构造函数在加法运算中使用了未初始化的成员变量familystuff
。你应该像这样初始化你的数据成员:
Mother::Mother() : motherstuff(0), familystuff(0), everyonesstuff(0) {}
Daughter::Daugher() : a(familystuff + 1) {}
你对面向对象的编程没有一个清晰的概念。当您创建两个对象时,它们将彼此完全不同。在 forced.So、
之前,他们不会相互交流myMum
和myDaughter
是独立的对象,它们不共享变量的值。- 最后两个输出基本上是垃圾值。你还没有初始化 myDaughter 的
familystuff
因此,如果您想从派生 class 访问受保护的成员,您需要编写以下内容:
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;
}
你会得到想要的输出!!