假设我有一个基类和派生类:
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
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