【问题标题】:One base to rule them all. One base to bring them all and in the darkness bind them [closed]一个基地来统治他们。一个基地将他们全部带入并在黑暗中束缚他们[关闭]
【发布时间】:2016-08-22 12:59:49
【问题描述】:

是否可以编写一个所有其他类(除了它)公开且虚拟继承的通用基类? (有 gcc 的解决方法吗?)。最好不要显式继承...因为我希望标准库的东西也可以从中继承....这样做是否明智?

如果您投反对票,请解释原因(我相信这是一个合理的问题,即使这是一件愚蠢的事情,它可能是,但这是问题的一部分)

【问题讨论】:

  • 没有明确说明?你是 Java 人吗?
  • @LukeLee 没有明确说明(不,我不是来自 Java)....我希望这甚至影响标准库的东西
  • 你想完成什么?
  • @Nayuki 主要是好奇

标签: c++ inheritance gcc


【解决方案1】:

是的。使用公共虚拟析构函数定义一个类。叫它base

现在在每节课后foo 这样做:

class foo:
  public virtual base

完成了!

这自然只适用于您自己的类型。如果您想对其他类型强制执行它,例如std,只需在您自己的notstd 命名空间类型中按类型重新实现std,并从您的base 继承所有类型。对于您想要使用的任何第三方库也是如此:有些可能被证明是不切实际的。

请注意,这可以更改类的二进制布局,并更改存在的保证:例如,没有此类foo 是标准布局。

另一方面,如果您想要一种行为与 C++ 基本相似但强制所有类都使用基类并将类与结构区分开来的新语言,请考虑

【讨论】:

  • 但他想要更多……
  • 回答“更多”部分,在gcc之前偷偷sed(通过定义一个函数)让所有的类都继承自foo:)
  • @axiom 这听起来像是在这个领域有经验的人
  • 我感觉……讽刺。是的。讽刺这个答案。嗯……讽刺意味很强。非常强大。
【解决方案2】:

试图硬塞进一个通用的虚拟基础会严重破坏 C++。

有许多语言规则允许对标准布局可简单复制类型进行特殊处理。具有虚拟基类的类都不符合这些条件。

即使是其他据称具有公共基类的系统(例如 Microsoft 的 .NET)也有一些 blit-able 类型,从基类继承是一个方便的谎言——不允许虚拟分派,所有调用都与继承的成员有关这些类中的一部分必须在编译时解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2010-09-20
    • 1970-01-01
    • 2012-08-21
    • 2011-11-21
    相关资源
    最近更新 更多