2015-06-10 3 views
1

У меня есть некоторые трудности с пониманием следующего кода. У меня есть 3 класса: A, B и C. A имеет частный x типа int. B наследует A и все от него. C наследует от B, но защищается. Это означает, что как X, так и Y становятся недоступными в классе C. Кроме того, get_x() и get_y() становятся защищенными в классе C. Таким образом, C должен иметь возможность доступа к функциям get_x() и get_y(), но не x и y?Не удается получить доступ к защищенному элементу

#include<iostream> 
using namespace std; 

class A 
{ 
int x; 
public: A(int i):x(i){} 
int get_x(){ return x; } 
}; 

class B: public A 
{ 
int y; 
public: B(int i,int j):y(i),A(j){} 
int get_y(){ return y; } }; 

class C: protected B 
{ 
int z; 
public: C(int i,int j,int k):z(i),B(j,k){} 
int get_z(){ return z; } 
}; 

int main() 
{ 
C c(1,2,3); 
cout<<c.get_x(); 
cout<<c.get_y(); 
cout<<c.get_z(); 
return 0; 
} 

ответ

4

Похоже, вы поняли «защищенное наследование» правильно, но неправильно поняли «защищенные члены и методы».

защищенные методы недоступны вне класса.

Значение

C c(1,2,3); 
cout << c.get_x(); // THIS DOES NOT WORK. 

, где вы можете получить доступ к get_x() находится в пределах класса С.

class C: protected B 
{ 
    int z; 
    public: C(int i,int j,int k):z(i),B(j,k){} 
    int get_z(){ return z; } 
    int get_x_from_c() { return this->get_x(); } // THIS IS ALLOWED. 
}; 
1

Здесь даже объект класса типа C не может использовать функции класса A и B. Если вы хотите получить доступ функций членов, то обнародует доступ B к C. сделать это ... класс с : public B {.. то он сможет получить доступ к функциям, но не помнит переменные-члены.

Смежные вопросы