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

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关键字。但这是微软特有的:

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

其他回答

这是我使用的一种方法,它使用宏而不是类型定义。我知道这不是c++做事情的方式,但是当只有层次结构中最下面的基类作用于继承的偏移时,通过继承将迭代器链接在一起是很方便的。

例如:

// some header.h

#define CLASS some_iterator
#define SUPER_CLASS some_const_iterator
#define SUPER static_cast<SUPER_CLASS&>(*this)

template<typename T>
class CLASS : SUPER_CLASS {
   typedef CLASS<T> class_type;

   class_type& operator++();
};

template<typename T>
typename CLASS<T>::class_type CLASS<T>::operator++(
   int)
{
   class_type copy = *this;

   // Macro
   ++SUPER;

   // vs

   // Typedef
   // super::operator++();

   return copy;
}

#undef CLASS
#undef SUPER_CLASS
#undef SUPER

我使用的通用设置使得在具有重复代码但必须重写的继承树之间读取和复制/粘贴非常容易,因为返回类型必须与当前类匹配。

可以使用小写super来复制Java中看到的行为,但我的编码风格是使用所有大写字母表示宏。

这种typedef的使用在你工作的代码中是超级常见/罕见/从未见过吗?

我从未在我使用的c++代码中见过这种特殊的模式,但这并不意味着它不在那里。

这种typedef的使用是超级Ok(也就是说,你看到强烈或不那么强烈的理由不使用它)?

它不允许多重继承(至少很干净)。

“super”应该是一个好东西吗?它应该在c++中标准化吗?或者通过类型定义来使用已经足够了吗?

由于上述引用的原因(多重继承),没有。你在你列出的其他语言中看到“super”的原因是它们只支持单继承,所以“super”指的是什么是没有混淆的。诚然,在这些语言中它是有用的,但在c++数据模型中却没有一席之地。

哦,顺便说一句:c++ /CLI以“__super”关键字的形式支持这个概念。但是请注意,c++ /CLI也不支持多重继承。

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

我只是找到了一个替代方案。我有一个大问题与类型定义方法今天咬我:

类型定义需要类名的精确副本。如果有人改变了类名,但没有改变类型定义,那么你就会遇到问题。

所以我用一个非常简单的模板想出了一个更好的解决方案。

template <class C>
struct MakeAlias : C
{ 
    typedef C BaseAlias;
};

所以现在,不是

class Derived : public Base
{
private:
    typedef Base Super;
};

你有

class Derived : public MakeAlias<Base>
{
    // Can refer to Base as BaseAlias here
};

在本例中,BaseAlias不是私有的,我已经尝试通过选择一个应该提醒其他开发人员的类型名称来防止粗心使用。

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