我的编码风格包括以下成语:
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#中实现的,除非我错了,否则在C#中将其称为“基础”。但是C ++缺少此关键字。
所以,我的问题是:
- 您使用的代码中是否经常使用typedef super common / rare / never?
- 使用typedef super可以吗(即您是否出于强烈的理由不使用它)?
- “ super”应该是一件好事吗,应该在C ++中进行某种标准化,还是通过typedef进行使用已经足够了?
编辑: Roddy提到了typedef应该是私有的事实。这将意味着任何派生类在不重新声明的情况下将无法使用它。但是我想这也会阻止super :: super链接(但是谁会为此哭泣?)。
编辑2:现在,在大规模使用“超级”几个月后,我完全同意罗迪的观点:“超级”应该是私有的。我会两次投票赞成他的回答,但我想我不能。
super
看起来Java
不错,但是...但是C++
支持多重继承。
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
这对我来说适用于gcc 9.1 --std = c ++ 1y(c ++ 14)。