默认类继承访问

时间:2010-09-28 09:33:57

标签: 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 
}

如我所见,我希望通过Derived访问Base :: Do。当我将Derive声明为

时,我得到一个编译错误,因为“类Base不可访问”
class Derived: public Base

它运作正常。

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

4 个答案:

答案 0 :(得分:103)

从标准文档 11.2.2

  

如果没有基类的访问说明符,则在使用以下方法定义派生类时,假定 public   使用 class-key 类定义类时,假定 class-key struct private

因此,对于struct s,默认值为public,对于class,默认值为private ...

标准文档本身的示例,

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

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

答案 1 :(得分:30)

您可能已经阅读了一些不完整或具有误导性的内容。引用Bjarne Stroustrup的“The C ++ programming Language”,第四版,p。 602:

  

class中,成员默认为private;在struct成员中   默认为public(§16.2.4)。

这也适用于没有访问级别说明符的继承成员。

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

答案 2 :(得分:9)

C ++中class的默认继承级别(缺少基类的访问说明符)是私有的。 [对于struct它是公开的]

class Derived:Base

Base是私下继承的,因此您无法在sth.Base::Do();main()执行,因为Base::Do()内的Derived是私有的

答案 3 :(得分:5)

继承的默认类型是private。 在您的代码中,

  

B级:A

只是

  

B类:私人A