默认的类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 } 

如所见,我希望通过派生来访问Base :: Do。 我得到一个编译错误,因为“class Base in accessible”,但是当我声明Derive为

 class Derived: public Base 

它工作正常。

我读过默认inheritance访问权限是公共的,那么为什么我需要在这里显式声明公有inheritance?

你可能读过一些不完整的或误导的东西。 引用“The C ++ programming Language”中的Bjarne Stroustrup,第四版,p。 602:

class ,成员默认是private ; 在struct ,成员默认是public (第16.2.4节)。

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

一个普遍的约定是,只使用结构来组织纯数据成员。 您正确使用了一个class来build模和实现对象行为。

从标准文档11.2.2

在没有基类的访问说明符的情况下,在派生类用类别键 结构定义的情况下假定为public,并且当用class-key类定义类时假定为private

所以,对于struct s默认是publicclass es,默认是private

标准文档本身的例子,

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

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

C ++中的class的默认inheritance级别(缺less基类的访问说明符)是私有的。 [对于struct是公共的]

class Derived:Base

Base是私人inheritance,所以你不能做sth.Base::Do();main()里面,因为Base::Do()Derived是私有的

inheritance的默认types是私有的。 在你的代码中,

B类:A

不过是

B类:私人A