在派生 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;
}

这里有几处错误:

  1. myDaughtermyMum 不同的对象 。你暗示他们之间有某种关系,但是有none.

  2. 您的代码有 未定义的行为,因为您的 Daughter 构造函数在加法运算中使用了未初始化的成员变量 familystuff

  3. 你应该像这样初始化你的数据成员:

    Mother::Mother() : motherstuff(0), familystuff(0), everyonesstuff(0) {}

    Daughter::Daugher() : a(familystuff + 1) {}

你对面向对象的编程没有一个清晰的概念。当您创建两个对象时,它们将彼此完全不同。在 forced.So、

之前,他们不会相互交流
  • myMummyDaughter 是独立的对象,它们不共享变量的值。
  • 最后两个输出基本上是垃圾值。你还没有初始化 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;
    }

你会得到想要的输出!!