2009-02-23 97 views
25

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

+0

MFC的类CRect继承自struct tagRECT,AFAICS。 – Constantin 2009-02-23 16:18:05

+0

我的不好 - 问题文字改变了。 – 2009-02-23 17:58:36

回答

33

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

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

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

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

9

当然,你是。关于继承的不同之处在于,如果你定义了一个类,它将从其他类/结构中继承私有。如果你定义一个结构和类或结构得到它,这将是一个公有继承默认:

// 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允许精确控制什么是暴露的,什么不是通过获取/设置函数,你仍然可以让它给你一个副本或引用包含的裸C结构对象。

7

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

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

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

相关问题