รูปแบบการเข้ารหัสของฉันมีสำนวนดังต่อไปนี้
class Derived : public Base
{
   public :
      typedef Base super; // note that it could be hidden in
                          // protected/private section, instead
      // Etc.
} ;สิ่งนี้ทำให้ฉันสามารถใช้ "super" เป็น alias to Base, ตัวอย่างเช่นใน constructors:
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 และ / หรือ templated
ความจริงก็คือ super ใช้งานใน Java เช่นเดียวกับใน C # (ที่เรียกว่า "ฐาน" เว้นแต่ฉันผิด) แต่ C ++ ขาดคำหลักนี้
ดังนั้นคำถามของฉัน:
- การใช้ typedef super common / Rare / ไม่เคยเห็นในรหัสที่คุณใช้
- การใช้ typedef super Ok นี้ (เช่นคุณเห็นเหตุผลที่แข็งแกร่งหรือไม่แรงเพื่อไม่ให้ใช้)
- ควร "super" เป็นสิ่งที่ดีควรเป็นมาตรฐานค่อนข้างใน C ++ หรือการใช้งานผ่าน typedef เพียงพอหรือไม่
แก้ไข: Roddy พูดถึงข้อเท็จจริงที่ typedef ควรเป็นแบบส่วนตัว นี่หมายความว่าคลาสที่ได้รับมาจะไม่สามารถใช้งานได้โดยไม่ต้องประกาศใหม่ แต่ฉันเดาว่ามันจะป้องกัน super :: super chaining (แต่ใครจะร้องไห้เพื่อสิ่งนั้น?)
แก้ไข 2:ตอนนี้หลายเดือนหลังจากใช้ "super" อย่างหนาแน่นฉันเห็นด้วยกับมุมมองของ Roddy: "super" ควรเป็นส่วนตัว ฉันจะถอนคำตอบของเขาสองครั้ง แต่ฉันเดาไม่ได้
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)