7

“默认情况下结构具有公共继承”这句话的真正含义是什么?为什么下面的代码是错误的,只是因为我在从 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();
}
4

3 回答 3

12

代表着

struct c;
struct d : c

相当于

struct d : public c

您的代码是class扩展 a struct

struct c;
class d : c;

相当于

class d : private c;

因为class默认情况下具有私有继承。

这意味着所有继承的而不是覆盖/重载/隐藏的方法c都是私有的d

于 2012-05-06T18:57:29.927 回答
6

“结构默认具有公共继承”意味着这

struct Derived : Base {};

相当于

struct Derived : public Base {};

默认情况下,类具有私有继承,因此当您public从类继承中删除时,您将拥有相当于

class Derived : private Base {};

在这个私有继承场景中,Derived与 没有is-a关系Base,它本质上是has-a Base。因此,您在这里尝试尝试的转换:

cc = &dd;

不允许。

于 2012-05-06T19:04:26.450 回答
2

当您编写 astruct并从某物继承而不指定访问说明符时,该继承被视为public. 当您编写 aclass并从某事物继承而不指定访问说明符(即使该事物是 a struct)时,该继承被视为私有。在您的代码中,您正在执行后者,因此继承是私有的,因此会出现观察到的错误。

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

于 2012-05-06T19:02:55.273 回答