假设我有一个基类和派生类:
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
它运作正常。
我已经读过默认继承访问是公共的,那为什么我需要在这里显式声明公共继承?
答案 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