【问题标题】:How NOT to use virtual inheritance?如何不使用虚拟继承?
【发布时间】:2011-10-03 09:57:14
【问题描述】:

我正在制作一个 win32 api 程序。我首先创建了一个名为 WinClass 的基类,并像其他十几个类一样从它继承。现在我需要从继承自基类 WinControlWinHandler 的两个类中创建一个派生类。因为我打算在原来的十几个中创建更多派生类,所以我'必须像从 WinClass 继承的每个类一样使用虚拟继承。那么有什么方法可以做到这一点使用虚拟继承? p>

【问题讨论】:

  • WinClass 提供什么功能?
  • 只是简单的抽象虚函数。它还包含受保护的 HWND _hwnd 和 HWND() 运算符

标签: c++ oop winapi inheritance virtual


【解决方案1】:

我首先创建了一个名为 WinClass 的基类,并像其他十几个类一样从它继承。

这是您的第一个问题。如果说 WPF 教会了我们什么,那就应该是继承不一定是 GUI 设计的最佳模型。

那么有什么方法可以在不使用虚拟继承的情况下做到这一点?

是的:没有WinControlWinHandler 派生自WinClass。你还没有说这些是做什么的,所以我不能提供任何关于它们的具体建议。确实,您需要的是“具有”关系,而不是继承带来的“是”关系。

此外,类名无需使用黑体字。只需使用 StackOverflow 提供的代码标签。也没有必要用粗体SHOUT

【讨论】:

  • “如果 WPF 教会了我们什么,那应该是继承不一定是 GUI 设计的最佳模型。”您是否建议我应该创建一个 xml 解析器?
  • @burningprodigy:您可以在没有 XAML 或任何类型的 XML 的情况下使用 WPF。我指的是 WPF 处理其类层次结构的方式,它非常扁平。您自定义 WPF 应用程序,不是通过派生新类型(通常),而是通过使用模板对象将您的数据结构链接到窗口中的特定控件,模板对象本身通常是通过组合构建的(“有一个”而不是“是一个")。个人认为,每个 GUI 设计师都应该熟悉 WPF;这并不是说每个 GUI 都应该是这样的,但它确实展示了包含如何制作更好的 GUI API。
【解决方案2】:

了解如何避免过度使用继承。例如,阅读这篇文章

http://berniesumption.com/software/inheritance-is-evil-and-must-be-destroyed/

《设计模式》一书是学习如何按照自己的方式完成工作(正确使用继承)的良好开端:

http://c2.com/cgi/wiki?DesignPatternsBook

【讨论】:

  • 谢谢。从文章来看,我是一个比我想象的更糟糕的程序员。 :( . 虽然它们提供了丰富的信息,:) (+1)
  • 总的来说,我发现“优先组合胜过继承”这一公理对我很有帮助。换句话说,尝试包装功能而不是仅仅包含它。
猜你喜欢
  • 2013-12-18
  • 2016-10-26
  • 2013-08-24
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多