2016-01-31 9 views
-5

У меня есть класс матери и производный дочерний класс. Я пытаюсь получить доступ к защищенной переменной «familystuff» в производном классе. Оба способа, к которым я пытаюсь получить доступ, не работают. Когда я скомпилировать и запустить его, я получаю следующий результат:Доступ к защищенной переменной в производном классе C++

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; 
} 
+7

«myDaughter» - это совершенно другой объект, он не волшебным образом обменивается памятью с помощью myMum – melak47

+0

Вы не даете 'myDaughter' никаких значений, чтобы он содержал случайный затвор. – Galik

+1

Итак, подумайте на секунду - как бы вы объявили 2 или 3 объекта Матери, а затем привяжите их к Дочери? – PaulMcKenzie

ответ

2

У вас нет четкой концепции в объектно-ориентированном программировании. Когда вы создаете два объекта, они полностью отличаются друг от друга. Они не взаимодействуют друг с другом, пока они не forced.So,

  • myMum и myDaughter являются отдельными объектами и они не разделяют ценности своих переменных.
  • Последние два выхода в основном являются значениями мусора. Вы не инициализирован 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; 
    } 

Вы получите желаемый результат !!

1

Есть несколько вещей, которые здесь не так :

  1. myDaughter и myMum являются различные объекты. Вы подразумеваете какие-то отношения между ними, но их нет.

  2. Ваш код имеет неопределенное поведение, потому что ваш Daughter конструктор использует неиницализированные переменную-член familystuff в операции сложения.

  3. Вы должны инициализирует свои элементы данных, как это:

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

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