结构体、类和继承(C++)

5

请问,在struct中,所有存取说明符(包括继承)是否都是public

换句话说:它们是否相等?

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

并且

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

你可以用一个非常小的程序来测试这个。 - Nobody moving away from SE
3
请查看这个关于C++中类和结构体区别的讨论线程:https://dev59.com/pnVD5IYBdhLWcg3wGHeu - Benjamin Gruenbaum
2
@Nobody:但这样他就得依赖于他的编译器没有漏洞 :) - Daniel Daranas
3个回答

7

是的,它们都是公开的。

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

等同于

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

对于类的成员,在 §11 中指定:

使用 class 关键字定义的类的成员默认为私有。使用 struct 或 union 关键字定义的类的成员默认为公共。

对于基类,在 §11.2 中说明:

在派生类定义时,如果没有为基类指定访问限定符,则假定为 public,当使用 class 关键字定义类时,默认为 private。

这里引用的是 C++11 标准。

2
从C++标准(C++ standard)11.2.2,第208页:
在没有指定基类的访问说明符的情况下,当派生类被声明为struct时,默认情况下继承为public,而当派生类被声明为class时,默认情况下继承为private。
因此,是的,您是正确的:当派生类是struct时,它会继承其他类作为public,除非您另行指定。

2
从C++11标准(N3242 draft)中:
11.2 基类和基类成员的可访问性
2 如果在基类中没有指定访问说明符,在派生类使用struct关键字定义时,默认为public;在使用class关键字定义时,默认为private。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接