访问派生类c ++

时间:2016-01-31 15:18:38

标签: c++ class protected derived

我有一个母班和一个派生的女儿班。我正在尝试访问受保护的变量' 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;
}

2 个答案:

答案 0 :(得分:2)

在面向对象编程中没有明确的概念。当您创建两个对象时,它们彼此完全不同。在他们被迫之前,他们不会互相交流。所以,

  • myDaughterfamilystuff是单独的对象,并且不会共享其变量的值。
  • 最后两个输出基本上是垃圾值。你还没有初始化myDaughter的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)

这里有几个问题:

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

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

  3. 您应该初始化您的数据成员,如下所示:

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

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