“结构默认具有公共继承”

时间:2012-05-06 18:56:50

标签: c++ inheritance

“结构默认具有公共继承”这句话的真正含义是什么?为什么以下代码出错只是因为我从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 = &dd;
    cc->fun();
}

3 个答案:

答案 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 {};

在此私有继承方案中,DerivedBase没有 is-a 关系,它本质上是 has-a {{ 1}}。所以你试图在这里尝试转换:

Base

是不允许的。

答案 2 :(得分:2)

当您编写struct并从某些内容继承而未指定访问说明符时,该继承将被视为public。当您编写class并从某些东西继承而未指定访问说明符时(即使该东西是struct),该继承被视为私有。在您的代码中,您正在执行后者,因此继承是私有的,因此是观察到的错误。

换句话说,默认情况下struct继承是公共的,实际上意味着在编写时继承完成struct默认是公共的,而不是继承来自 struct默认是公开的。