默认的类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默认是public
和class
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