当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在C++中,我可以从结构中派生一个类》经验,为你挑选了3个好方法。

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



1> Alex B..:

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

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

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

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



2> Johannes Sch..:

你当然是.关于继承的不同之处在于,如果定义一个类,它将从其他类/结构继承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结构对象的副本或引用.



3> Stephen C. S..:

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

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

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有