“结构默认具有公共继承”这句话的真正含义是什么?为什么以下代码出错只是因为我从c?中导出类d时省略了关键字'public'
struct c
{
protected:
int i;
public:
c(int ii=0):i(ii){}
virtual c *fun();
};
c* c::fun(){
cout<<"in c";
return &c();
}
class d : c
{
public:
d(){}
d* fun()
{
i = 9;
cout<<"in d"<<'\t'<<i;
return &d();
}
};
int main()
{
c *cc;
d dd;
cc = ⅆ
cc->fun();
}
答案 0 :(得分:10)
这意味着
struct c;
struct d : c
相当于
struct d : public c
您的代码是class
,其范围为struct
:
struct c;
class d : c;
相当于
class d : private c;
因为class
默认具有私有继承。
这意味着来自c
的所有继承而非覆盖/重载/隐藏的方法在d
中都是私有的。
答案 1 :(得分:6)
“一个结构体默认具有公共继承”意味着这个
struct Derived : Base {};
相当于
struct Derived : public Base {};
默认情况下,类具有 私有 继承,因此当您从类继承中删除public
时,您具有等效的
class Derived : private Base {};
在此私有继承方案中,Derived
与Base
没有 is-a 关系,它本质上是 has-a {{ 1}}。所以你试图在这里尝试转换:
Base
是不允许的。
答案 2 :(得分:2)
当您编写struct
并从某些内容继承而未指定访问说明符时,该继承将被视为public
。当您编写class
并从某些东西继承而未指定访问说明符时(即使该东西是struct
),该继承被视为私有。在您的代码中,您正在执行后者,因此继承是私有的,因此是观察到的错误。
换句话说,默认情况下struct
继承是公共的,实际上意味着在编写时继承完成struct
默认是公共的,而不是继承来自 struct
默认是公开的。