请原谅我的英语技能;因为我不是母语人士。
我从大学教科书中得到了这段代码,我很难理解它几个小时......
#include<iostream>
using namespace std;
class base{
int a;
protected:
void seta(int a){this->a=a;}
public:
void showa(){cout<<a;}
};
class derived: private base{
int b;
protected:
void setb(int b){this->b=b;}
public:
void showb(){
seta(5); //1
showa(); //2
cout<<b;
}
};
class grandderived: private derived{
int c;
protected:
void setab(int x){
seta(x); //3
showa(); //4
setb(x); //5
}
};
int main(){
return 0;
}
以下是我的理解:
class derived
将class base
作为private继承,因此class base中的所有内容都是私有的。无法从子类访问afaik私有成员。
所以,1号,2号不会起作用。
class grandderived
也将类derived
作为私有继承,因此3,4和5也不会出于同样的原因。
但答案告诉我只有3号和4号不会工作,其他人会工作。 我编译了它,是的它告诉我同样的事情。
我是否误解了继承如何运作,或者还有其他我不知道的事情?答案 0 :(得分:3)
我相信这就是发生的事情:
base
类声明seta
和showa
为受保护且公开的。这意味着子类可以访问它们。
derived
继承自base
。这意味着它可以访问base
中受保护和公开的所有内容,其中包括seta
和showa
。私有地继承base
的事实意味着继承的成员将被标记为私有,因此无法在子类derived
(即grandderived
)的类中访问。
在derived
和grandderived
之间出现相同的模式。
因此:derived
可以访问base
中的方法,grandderived
可以访问derived
中的方法,但不能访问base
。
答案 1 :(得分:1)
你关闭了。
grandderived
继承自derived
并将其标记为私有。但是,这意味着从derived
继承的类将无法访问从grandderived
继承的方法。以同样的方式,derived
继承自base
,将其标记为私有。
效果是grandderived
可以访问derived
但不base
的方法。
答案 2 :(得分:1)
derived
类私有地继承base
类,这意味着base
类的所有公共成员和受保护成员在派生类中变为私有。
即使它是私有继承,private
也可以访问base
的所有受保护和公共成员。所以1号和2号工作。
base::seta
是受保护的成员,在derived
的范围内变为私有。 grandderived
无法访问derived
个私人会员,因此第3和第4人无法工作。
derived::setb
,数字5,在类derived
中声明受保护时起作用。虽然它在grandderived
的范围内变为私有,但它本身是可访问的。它不能进一步继承。
答案 3 :(得分:0)
正如您可以访问private
成员但其他人无法访问,您可以访问private
基类,但其他人不能。这就是为什么课程derived
可以访问base::seta
,但课程gradderived
可以访问。
主要效果private
继承是派生类型的对象不能(从类外部)转换为基类类型。