"结构默认具有公共继承"

use*_*138 6 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();
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 10

这意味着

struct c;
struct d : c
Run Code Online (Sandbox Code Playgroud)

相当于

struct d : public c
Run Code Online (Sandbox Code Playgroud)

您的代码是一个class扩展的struct:

struct c;
class d : c;
Run Code Online (Sandbox Code Playgroud)

相当于

class d : private c;
Run Code Online (Sandbox Code Playgroud)

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

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


jua*_*nza 6

"默认情况下,结构体具有公共继承"意味着这一点

struct Derived : Base {};
Run Code Online (Sandbox Code Playgroud)

相当于

struct Derived : public Base {};
Run Code Online (Sandbox Code Playgroud)

默认情况下,类具有私有继承,因此当您public从类继承中删除时,您具有等效的继承

class Derived : private Base {};
Run Code Online (Sandbox Code Playgroud)

在这个私有继承场景中,Derived没有is-a关系Base,它本质上有-a Base.所以你试图在这里尝试转换:

cc = &dd;
Run Code Online (Sandbox Code Playgroud)

不被允许.