【问题标题】:Can Virtual Classes in C++ have Member Variables?C++ 中的虚拟类可以有成员变量吗?
【发布时间】:2011-05-18 23:18:59
【问题描述】:

假设我有一个纯虚拟类,我可以在 C++ 中做这样的事情吗:

class ITreatable
{
    public:
       bool hasBeenTreated;           // <- Can this be here?
       virtual bool Treat() = 0;
};

如果没有,我如何确保继承ITreatable 的类有一个名为hasBeenTreated 的成员变量?那可能吗?是否有某种最佳做法可以避免这样做/建议不要这样做?

谢谢

编辑:另外,我将如何为这样的类定义构造函数?

Edit2:我知道公共成员变量是不好的做法,我只是想知道这种设计在 C++ 中是否是一个好主意。

【问题讨论】:

  • 这是 C++ 而不是 Java! ;) 在 C++ 中没有 纯接口 这样的东西(如果有,它是人为的 - 即开发人员强制执行)。因此,您可以在 C++ 的基类中包含任何您想要的内容,包括成员变量。但是使用适当的封装......就像你对任何其他类的普通构造函数一样......
  • @Nim 是的,我明白,但我从未真正使用过 Java :) 但我正在阅读一些 Java 代码,想知道我是否可以在 C++ 中“模仿”Java 接口。
  • @Peter R.,没有什么能阻止您尝试从 C++ 模仿 Java,请注意编译器不会强制执行任何限制(如上述限制)。
  • @Peter R. 为什么?再次回到我原来的观点,你在用 C++ 编程,为什么要混合概念?如果基类允许你存储通用性——为什么你希望所有派生类都实现相同的东西——只是为了让它像 Java 一样?
  • @Nim 我只是想尝试一下。这不是真正的生产代码,它只是在我脑海中闪过,我想我会得到一些反馈。也许如果我使用接口,那么很多代码都可以重用和轻松扩展,你不觉得吗?

标签: c++


【解决方案1】:

绝对的。

严格来说,不存在“虚拟类”这样的东西。我了解您使用该术语表示仅由数据成员和虚拟成员函数构成的类。

考虑到只有函数可以是虚函数;如果您希望以多态方式访问数据成员,则必须通过函数来​​实现。因此,请使用虚拟 getter/setter 函数,并保持数据成员的私密性。

【讨论】:

  • +1 为了得到我真正的意思 :) 我实际上正在实施这个,但它越过了我的脑海,我想我会得到一些关于这种方法的有用性/正确性的反馈。在我看来,我也误解了接口的概念:/
  • @PeterR:没问题!如果有帮助,接口通常只指定功能。 (实际上,即使没有帮助也是如此:P)
【解决方案2】:

根据MSDN,接口具有以下特征:

  • 接口类(或结构)必须在命名空间中声明 并且可能具有公共或私人可访问性。只有公共接口 被发送到元数据。
  • 接口的成员可以包括属性、方法和 事件。
  • 所有接口成员都是隐式公共和虚拟的。
  • 不允许使用字段和静态成员。
  • 用作属性、方法参数或返回的类型 值只能是 Windows 运行时类型;这包括 基本类型和枚举类类型。

所以我会用

来回答你的问题

如果你想要一个界面

是的,如果您只使用抽象类,但正如其他人所说,将它们设为私有并使用公共 getter 和 setter

【讨论】:

    【解决方案3】:

    是的。

    C++ 中没有“纯虚拟”类的概念,只有具有虚拟成员的抽象类。

    至于有没有最佳实践,我想说这个例子最大的实践就是不使用公共变量。相反,在修改私有变量的基类中定义一个 setter/getter。

    【讨论】:

    • 感谢您的回答。是的,我认为 hasBeenTreatated 变量应该受到保护,但我想知道总体上遵循这样的设计是否是个好主意。
    • @Peter R.,使用 setter 和 getter 将其设为私有。你永远不希望你的类完全失去对自己变量的控制。
    【解决方案4】:

    这是可能的。 C++ 没有由该语言强制执行的接口,因此您的示例就像普通的类定义一样,没有任何特殊规则。

    在类中将变量声明为 public 被认为是不好的做法。您可能希望将其设为私有并为其声明访问器/修改器或将其声明为受保护。

    【讨论】:

    • 当涉及到变量时,即使受保护也是不受欢迎的。它与 public 有所有相同的问题,除了它只影响基类。
    • @Tomalak,它的“影响”。 Affect 最常用作动词,而 effect 最常用作名词。 :Pgrammar.quickanddirtytips.com/affect-versus-effect.aspx
    • @Stargazer712:我不敢相信我做到了。应该是喝醉了。道歉。
    • @Tomalak,在你让我检查自己之前,我对两者之间的区别并没有信心,所以谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-01-22
    相关资源
    最近更新 更多