5

Could you ensure me, if all access specifiers (including inheritance) in struct are public ?

In other words: are those equal?

class C: public B, public A { public:
    C():A(1),B(2){}
    //...
};

and

struct C: B, A {
    C():A(1),B(2){}
    //...
};
betabandido
  • 18,008
  • 10
  • 57
  • 72
Grzegorz Wierzowiecki
  • 10,210
  • 9
  • 49
  • 86

3 Answers3

7

Yes, they all are public.

struct A : B {
  C c;
  void foo() const {}
}

is equivalent to

struct A : public B {
 public:
  C c;
  void foo() const {}
}

For members, it is specified in §11:

Members of a class defined with the keyword class are private by default. Members of a class defined with the keywords struct or union are public by default.

and for for base classes in §11.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.

where the references are to the C++11 standard.

juanchopanza
  • 216,937
  • 30
  • 383
  • 461
2

From C++ standard, 11.2.2, page 208:

In the absence of an access-specifier for a base class, public is assumed when the derived class is declared struct and private is assumed when the class is declared class.

So yes, you are correct: when the derived class is a struct, it inherits other classes as public unless you specify otherwise.

Sergey Kalinichenko
  • 697,062
  • 78
  • 1,055
  • 1,465
2

From the C++11 Standard (N3242 draft)

11.2 Accessibility of base classes and base class members

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.

mloskot
  • 35,141
  • 11
  • 102
  • 125