这个问题说明了一切。我允许从结构中派生类,还是应该创建一个嵌入我的结构并定义复制构造函数的类,并在两者之间移动一个=运算符?在C++中,我可以从结构中派生一个类
25
A
回答
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的函数的参数,反之亦然。
相关问题
- 1. C#是否可以从派生类中调用基类属性
- 2. 我想从基类onLoad()覆盖在c#中的派生类的控件(主页从一个masterClass派生)
- 3. 从派生自同一类的类派生的C++子类
- 4. 包含派生类型的Fortran派生类型可以从C访问
- 5. 为什么我可以从一个模板/通用类派生基于该类型在C#/ C++
- 6. C++访问碱的私人结构中派生类
- 7. 我可以在派生类中创建一个公共成员变量private吗?
- 8. 我可以命名从接口派生的每个类吗?
- 9. 为什么一个Struct不能从另一个结构派生?
- 10. C++中派生类的对象可以被父类访问吗?
- 11. C#。我可以自动替换派生类而不是基类
- 12. 我可以让派生类在Java中从其基类继承派生成员吗?
- 13. 是否可以派生(RustcEncodable)的一部分结构?
- 14. 我可以在派生类中使用wxPython wx.ItemContainer吗?
- 15. 我可以在activex控件中使用CView派生类吗?
- 16. 在C++中调用的基类和派生类构造函数
- 17. 当我在C++中派生一个类时,它是否创建一个基类对象并将其作为我的成员变量存储在派生类中?
- 18. C#从多个抽象类派生一个类
- 19. 动态内存和C派生结构++
- 20. C++结构实现派生接口
- 21. 从调用派生类的基类构造函数在Java中
- 22. 引用返回结构/派生类型
- 23. 在C++中,我可以在不生成整个数据结构的情况下找到数据结构吗?
- 24. C++派生类
- 25. C++派生类
- 26. 我们可以在类型上定义一个结构吗?
- 27. 我是否应该在派生类中有一个构造函数?
- 28. 为什么我的派生类是一个抽象类? C++
- 29. 你能从一个非托管C++类派生一个托管C++类吗?
- 30. 我可以在结构中放置一个函数吗?
MFC的类CRect继承自struct tagRECT,AFAICS。 – Constantin 2009-02-23 16:18:05
我的不好 - 问题文字改变了。 – 2009-02-23 17:58:36