【问题标题】:in C++, can I derive a class from a struct在 C++ 中,我可以从结构派生一个类吗
【发布时间】:2010-10-09 07:31:19
【问题描述】:

这个问题真的说明了一切。我是否允许从结构派生一个类,或者我应该创建一个嵌入我的结构并定义复制构造函数和 = 运算符以在两者之间移动的类?

【问题讨论】:

  • MFC的类CRect继承自struct tagRECT, AFAICS。
  • 我的错误 - 问题的文本已更改。

标签: c++ data-structures


【解决方案1】:

在 C++ 中,struct(几乎)是 class 的同义词(除了不同的默认访问级别),所以是的,您可以。

struct A {
// fields are public by default
};

class B: public A {
// fields are private by default
};

我不熟悉 MFC,但它看起来像是在尝试同时维护 C 和 C++ API。

【讨论】:

  • 谢谢。我很确定这没问题,但实际上从未在实践中看到过。
【解决方案2】:

你当然是。关于继承的不同之处在于,如果您定义一个类,它将从其他类/结构继承私有。如果你定义一个结构体并从一个类或结构体派生它,默认情况下它将是一个公共继承:

// the following two are equivalent except that one time class is 
// used and the other time struct
struct f : g { };
class f : public g { };

如果您想知道应该如何包装 C 结构 - 我会将它们作为成员嵌入到类中。因为 C 结构并非设计为继承自(想想 C 结构中的既不是受保护的也不是虚拟的析构函数——它们不能有一个)。它们是收集数据的简单聚合。并将它们作为成员使用它们(例如“一个点具有一对 x 和一个 y 坐标”)。

C 结构还公开了可能不应该在类中公开的成员。包含允许通过 get/set 函数精确控制公开的内容和不公开的内容,您仍然可以让它为您提供对包含的裸 C 结构对象的副本或引用。

【讨论】:

    【解决方案3】:

    是的。您可以从结构派生一个类。在 C++ 中,结构只是一个默认访问是公共而不是私有的类。从仅添加非虚拟成员函数和/或静态函数的结构派生类是提供 C++ 接口同时保持与 C 样式 API 的兼容性的有用技术。

    这正是 MFC 用于许多 C 结构的方法(与您在问题中所说的相反)。

    例如,CRect 类是从 struct tagRECT 公开派生的(更常用的名称 RECT 是 struct tagRECT 的 typededf)。因为 struct tagRECT 定义了所有数据成员,而 CRect 只添加了非虚拟成员函数,所以 CRect 和 RECT 的内存布局是相同的 - 您可以使用 CRect 作为任何预期为 RECT 的函数的参数,反之亦然。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多