내 코딩 스타일에는 다음 관용구가 포함됩니다.
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는 C #뿐만 아니라 Java에서도 구현됩니다 (잘못된 경우가 아니라면 "base"라고합니다). 그러나 C ++에는이 키워드가 없습니다.
그래서 내 질문 :
- 이 타입 정의 사용은 작업 코드에서 보지 못했습니까?
- typedef super Ok를 사용합니까 (즉, 사용하지 않을 강력한 이유가 있습니까)?
- "super"가 좋은 것이어야합니까, C ++에서 다소 표준화되어야합니까, 아니면 typedef를 통해 이미 사용하고 있습니까?
편집 : Roddy는 typedef가 비공개이어야한다는 사실을 언급했습니다. 이것은 파생 클래스가 클래스를 다시 선언하지 않으면 사용할 수 없다는 것을 의미합니다. 그러나 그것은 그것이 super :: super chaining을 막을 것이라고 생각합니다 (그러나 누가 울겠습니까?).
편집 2 : "슈퍼"를 대량으로 사용한 지 몇 개월이 지나서 나는 Roddy의 견해에 전적으로 동의합니다. "슈퍼"는 사적이어야합니다. 나는 그의 대답을 두 번 찬성했지만 나는 할 수 없다고 생각합니다.
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)에서 나에게 효과적이었습니다.