在C ++中,我可以从结构中派生一个类

时间:2009-02-23 12:19:01

标签: c++ data-structures

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

3 个答案:

答案 0 :(得分:34)

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

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

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

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

答案 1 :(得分:9)

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

// 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结构也暴露了可能不应该在类中公开的成员。 Containment允许精确控制暴露的内容和get / set函数的内容,你仍然可以让它给你一个包含的裸C结构对象的副本或引用。

答案 2 :(得分:7)

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

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

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