รูปแบบการเข้ารหัสของฉันมีสำนวนดังต่อไปนี้
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)