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

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是verbose和/或模板化的时候。

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

我的问题是:

这种typedef的使用在你工作的代码中是超级常见/罕见/从未见过吗? 这种typedef的使用是超级Ok(也就是说,你看到强烈或不那么强烈的理由不使用它)? “super”应该是一个好东西吗?它应该在c++中标准化吗?或者通过类型定义来使用已经足够了吗?

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

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


当前回答

我经常看到它被使用,有时作为super_t,当基类是一个复杂的模板类型时(例如boost::iterator_adaptor就是这样做的)

其他回答

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

DDD(死亡之钻)问题。

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

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

我使用__super关键字。但这是微软特有的:

http://msdn.microsoft.com/en-us/library/94dw1w7x.aspx

我不知道这种情况是否罕见,但我肯定也做过同样的事情。

正如前面所指出的,当一个类使用多重继承时,这部分语言本身的困难就出现了。

微软已经在他们的编译器中添加了__super的扩展。

我不记得以前见过这个,但乍一看我很喜欢。正如Ferruccio所指出的那样,它在MI面前并没有很好地发挥作用,但MI更像是一个例外,而不是规则,没有什么东西需要在任何地方都可用才能有用。