在 C 中使用“超级”

新手上路,请多包涵

我的编码风格包括以下成语:

 class Derived : public Base
{
   public :
      typedef Base super; // note that it could be hidden in
                          // protected/private section, instead

      // Etc.
} ;

这使我能够使用“super”作为 Base 的别名,例如,在构造函数中:

 Derived(int i, int j)
   : super(i), J(j)
{
}

甚至在从其覆盖版本中的基类调用方法时:

 void Derived::foo()
{
   super::foo() ;

   // ... And then, do something else
}

它甚至可以被链接起来(不过,我仍然需要找到它的用途):

 class DerivedDerived : public Derived
{
   public :
      typedef Derived super; // note that it could be hidden in
                             // protected/private section, instead

      // Etc.
} ;

void DerivedDerived::bar()
{
   super::bar() ; // will call Derived::bar
   super::super::bar ; // will call Base::bar

   // ... And then, do something else
}

无论如何,我发现“typedef super”的使用非常有用,例如,当 Base 是冗长和/或模板化时。

事实是 super 是用 Java 和 C# 实现的(它被称为“base”,除非我错了)。但是 C++ 缺少这个关键字。

所以,我的问题:

  • 在您使用的代码中,这种使用 typedef 是超级常见/罕见/从未见过的吗?
  • 这种使用 typedef 是否超级好(即您是否看到了不使用它的强烈或不那么强烈的理由)?
  • “超级”应该是一件好事,它是否应该在 C++ 中有所标准化,或者通过 typedef 使用它已经足够了吗?

编辑: Roddy 提到 typedef 应该是私有的。这意味着任何派生类都无法在不重新声明的情况下使用它。但我想它也会阻止 super::super 链接(但谁会为此哭泣呢?)。

编辑2: 现在,在大量使用“超级”几个月后,我完全同意罗迪的观点:“超级”应该是私有的。

原文由 paercebal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 792
2 个回答

Bjarne Stroustrup 在 C++ 的设计和演进中 提到 super 在 C++ 首次标准化时被 ISO C++ 标准委员会考虑作为关键字。

Dag Bruck 提出了这个扩展,称基类为“继承的”。该提案提到了多重继承问题,并且会标记出模棱两可的用途。甚至 Stroustrup 也深信不疑。

经过讨论,Dag Bruck(是的,提出提案的人)写道,该提案是可实施的、技术上合理的、没有重大缺陷的,并且处理了多重继承。另一方面,没有足够的收益,委员会应该处理一个更棘手的问题。

Michael Tiemann 迟到了,然后证明 typedef’ed super 可以正常工作,使用的技术与本文中提到的相同。

所以,不,这可能永远不会标准化。

如果您没有副本, Design and Evolution 非常物有所值。使用过的副本大约需要 10 美元。

原文由 Max Lybbert 发布,翻译遵循 CC BY-SA 3.0 许可协议

为什么 c++ 不支持“super”关键字的简单答案是。

DDD(Deadly Diamond of Death)问题。

在多重继承中。编译器会混淆哪个是超类。

在此处输入图像描述

那么哪个超类是“D”的超类? “Both”不能成为解决方案,因为“super”关键字是指针。

原文由 I am not englishman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题