这个问题说的都是真的.我是否允许从结构派生一个类,或者我应该创建一个嵌入我的结构的类并定义复制构造函数和一个=运算符来在两者之间移动?
在C++ struct
中(几乎)是a的同义词class
(除了不同的默认访问级别),所以是的,你可以.
struct A { // fields are public by default }; class B: public A { // fields are private by default };
我不熟悉MFC,但它看起来像是试图维护C和C++ API.
你当然是.关于继承的不同之处在于,如果定义一个类,它将从其他类/结构继承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结构对象的副本或引用.
是.你可以从一个struct派生一个类.在C++中,struct只是一个默认访问是公共而非私有的类.从仅添加非虚用成员函数和/或静态函数的结构派生类是提供C++接口同时保持与C样式API的兼容性的有用技术.
这正是MFC用于许多C结构的方法(与您在问题中的陈述相反).
例如,CRect类是从struct tagRECT公开派生的(更常用的名称RECT是struct tagRECT的typededf).因为struct tagRECT定义了所有数据成员,而CRect只添加了非虚拟成员函数,所以CRects和RECT的内存布局是相同的 - 你可以使用CRect作为任何期望RECT的函数的参数,反之亦然.