Default class inheritance access
Suppose I have a base and derived class:
开发者_StackOverflow中文版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
}
as seen I wish to access Base::Do through Derived. I get a compile error as "class Base in inaccessible" however when I declare Derive as
class Derived: public Base
it works ok.
I have read default inheritance access is public, then why I need to explicitly declare public inheritance here?
From standard docs, 11.2.2
In the absence of an access-specifier for a base class, public is assumed when the derived class is defined with the class-key struct and private is assumed when the class is defined with the class-key class.
So, for struct
s the default is public
and for class
es, the default is private
...
Examples from the standard docs itself,
class D3 : B { / ... / }; // B private by default
struct D6 : B { / ... / }; // B public by default
You might have read something incomplete or misleading. To quote Bjarne Stroustrup from "The C++ programming Language", fourth Ed., p. 602:
In a
class
, members are by defaultprivate
; in astruct
, members are by defaultpublic
(§16.2.4).
This also holds for members inherited without access level specifier.
A widespread convention is, to use struct only for organization of pure data members. You correctly used a class
to model and implement object behaviour.
The default inheritance level (in absence of an access-specifier for a base class )for class
in C++ is private. [For struct
it is public]
class Derived:Base
Base
is privately inherited so you cannot do sth.Base::Do();
inside main()
because Base::Do()
is private inside Derived
The default type of the inheritance is private. In your code,
class B:A
is nothing but
class B: private A
精彩评论