默认类继承访问

pau*_*ons 47 c++ inheritance

假设我有一个基类和派生类:

class Base
{
    public:
    virtual void Do();
}

class Derived:Base
{
    public:
    virtual void Do();
}

int main()
{
    Derived sth;
    sth.Do(); // calls Derived::Do OK
    sth.Base::Do(); // ERROR; not calls Based::Do 
}
Run Code Online (Sandbox Code Playgroud)

如我所见,我希望通过Derived访问Base :: Do.我得到一个编译错误,因为"类Base不可访问"但是当我声明Derive as时

class Derived: public Base
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我已经读过默认继承访问是公共的,那为什么我需要在这里显式声明公共继承?

lia*_*iaK 105

从标准文档,11.2.2

在没有访问说明符为基类的,公共当派生的类与定义的假定 的类键 结构私人当类与定义的假定的类键 .

因此,对于structs,默认值是public和,对于classes,默认值是private......

标准文档本身的示例,

class D3 : B { / ... / }; // B private by default

struct D6 : B { / ... / }; // B public by default

  • 这应该是答案. (23认同)

Pet*_* G. 30

您可能已经读过不完整或误导的内容.引用Bjarne Stroustrup的"The C++ programming Language",第四版,p.602:

在a中class,成员是默认的private; 在a中struct,成员是默认的public(第16.2.4节).

对于没有访问级别说明符而继承的成员,这也适用.

一种普遍的惯例是,仅使用struct来组织纯数据成员.您正确地使用了a class来建模和实现对象行为.


Pra*_*rav 10

classC++中的默认继承级别(在没有基类的访问指定符的情况下)是私有的.[因为struct它是公开的]

class Derived:Base

Base是私人继承的,所以你不能在sth.Base::Do();里面做,main()因为Base::Do()是内部私人Derived


Sat*_*ish 7

继承的默认类型是private.在你的代码中,

B级:A

不过是

B级:私人A.