Phong cách mã hóa của tôi bao gồm các thành ngữ sau:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Điều này cho phép tôi sử dụng "siêu" làm bí danh cho Base, ví dụ, trong các hàm tạo:
Derived(int i, int j)
: super(i), J(j)
{
}
Hoặc thậm chí khi gọi phương thức từ lớp cơ sở bên trong phiên bản bị ghi đè của nó:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Nó thậm chí có thể bị xiềng xích (mặc dù tôi vẫn phải tìm cách sử dụng cho việc đó):
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
}
Dù sao, tôi thấy việc sử dụng "typedef super" rất hữu ích, ví dụ, khi Base là dài dòng và / hoặc templated.
Thực tế là siêu được triển khai trong Java, cũng như trong C # (nơi nó được gọi là "cơ sở", trừ khi tôi sai). Nhưng C ++ thiếu từ khóa này.
Vì vậy, câu hỏi của tôi:
- việc sử dụng typedef này có phổ biến / hiếm / chưa từng thấy trong mã bạn làm việc không?
- Đây có phải là cách sử dụng typedef super Ok (tức là bạn thấy lý do mạnh mẽ hay không mạnh mẽ để không sử dụng nó)?
- "siêu" nên là một điều tốt, nó nên được chuẩn hóa phần nào trong C ++, hay việc sử dụng này thông qua một typedef đã đủ chưa?
Chỉnh sửa: Roddy đã đề cập đến thực tế typedef nên ở chế độ riêng tư. Điều này có nghĩa là bất kỳ lớp dẫn xuất nào sẽ không thể sử dụng nó mà không khai báo lại. Nhưng tôi đoán nó cũng sẽ ngăn chặn siêu :: siêu xích (nhưng ai sẽ khóc vì điều đó?).
Chỉnh sửa 2: Bây giờ, vài tháng sau khi sử dụng ồ ạt "siêu", tôi hoàn toàn đồng ý với quan điểm của Roddy: "siêu" nên riêng tư. Tôi sẽ nâng cao câu trả lời của anh ấy hai lần, nhưng tôi đoán là không thể.
super
vẻ như Java
và nó không có gì xấu, nhưng ... Nhưng C++
hỗ trợ nhiều kế thừa.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
ở mọi nơi)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Điều này làm việc với tôi với gcc 9.1 --std = c ++ 1y (c ++ 14).