我的编码风格包括以下成语:
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++ 缺少这个关键字。
所以,我的问题:
编辑: Roddy 提到 typedef 应该是私有的。这意味着任何派生类都无法在不重新声明的情况下使用它。但我想它也会阻止 super::super 链接(但谁会为此哭泣呢?)。
编辑2: 现在,在大量使用“超级”几个月后,我完全同意罗迪的观点:“超级”应该是私有的。我会两次赞成他的回答,但我想我不能。
Bjarne Stroustrup 在 C 的 设计和演进中super提到,在C 第一次标准化时,ISO C++ 标准委员会考虑将其作为关键字。
super
Dag Bruck 提出了这个扩展,称基类为“继承的”。该提案提到了多重继承问题,并且会标记出模棱两可的用途。甚至 Stroustrup 也深信不疑。
经过讨论,Dag Bruck(是的,提出提案的人)写道,该提案是可实施的、技术上合理的、没有重大缺陷的,并且处理了多重继承。另一方面,没有足够的收益,委员会应该处理一个更棘手的问题。
Michael Tiemann 迟到了,然后证明 typedef’ed super 可以正常工作,使用的技术与本文中提到的相同。
所以,不,这可能永远不会标准化。
如果您没有副本, Design and Evolution 非常物有所值。使用过的副本大约需要 10 美元。