c++私有类继承
c++ private class inheritance
请原谅我的英语水平;因为我的母语不是英语。
我从我的大学课本上得到了这个代码,我花了几个小时才理解它。
#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;
}
以下是我到目前为止的理解:
类derived
作为私有继承了类base
,因此类基中的所有内容都是私有的。Afaik私有成员不能从子类访问。所以,1,2不行。类grandderived
也继承了类derived
作为私有,因此3,4和5也将不能工作。
但是答案告诉我只有3号和4号不行,其他的都可以。我编译了它,是的,它告诉我相同。
我是否误解了继承的工作方式,或者还有其他我不知道的事情?
我相信事情是这样的:
-
base
类将seta
和showa
声明为protected和public。 -
derived
继承自base
。这意味着它可以访问base
(包括seta
和showa
)中受保护和公开的所有内容。它私有继承base
的事实意味着继承的成员将被标记为私有,因此不能在子类化derived
(即grandderived
)的类中访问。 -
同样的模式在
derived
和grandderived
之间发生。
因此:derived
可以访问base
的方法,grandderived
可以访问derived
的方法,但不能访问base
的方法。
你很接近了。
grandderived
继承自derived
并将其标记为private。然而,这意味着从derived
继承的方法将不能从继承grandderived
的类中访问。同样,derived
继承自base
,将其标记为private。
结果是grandderived
可以访问derived
而不能访问base
的方法。
derived
类私有继承base
类,这意味着base
类的所有public和protected成员在派生类中都变为private。
尽管private
是私有继承,但它可以访问base
的所有受保护成员和公共成员。所以表述1和2是正确的。
base::seta
是base中的受保护成员,在derived
的作用域中变为private。grandderived
不能访问derived
的私有成员,因此3和4不能工作。
derived::setb
,编号5,它在derived
类中被声明为受保护。尽管它在grandderived
的作用域中是私有的,但它本身是可访问的。它不能再遗传下去了。
就像你可以访问你的private
成员而其他人不能一样,你可以访问你的private
基类而其他人不能。这就是为什么derived
类可以访问base::seta
,而gradderived
类不能。
private
继承的主要作用是派生类型的对象不能(从类外部)强制转换为基类类型。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象