3 回答

TA貢獻1829條經驗 獲得超6個贊
我一直使用“繼承”而不是超級。(可能是由于Delphi的背景),我總是將其設置為private,以避免在類中錯誤地省略“繼承”但子類嘗試使用它時的問題。
class MyClass : public MyBase
{
private: // Prevents erroneous use by other classes.
typedef MyBase inherited;
...
用于創建新類的標準“代碼模板”包括typedef,因此我幾乎沒有機會無意忽略它。
我認為鏈式的“ super :: super”建議不是一個好主意-如果這樣做,您可能很難與特定的層次結構綁定在一起,并且更改它可能會嚴重破壞某些東西。

TA貢獻1784條經驗 獲得超8個贊
這樣做的一個問題是,如果您忘記(重新)定義派生類的super,那么對super :: something的任何調用都會編譯良好,但可能不會調用所需的函數。
例如:
class Base
{
public: virtual void foo() { ... }
};
class Derived: public Base
{
public:
typedef Base super;
virtual void foo()
{
super::foo(); // call superclass implementation
// do other stuff
...
}
};
class DerivedAgain: public Derived
{
public:
virtual void foo()
{
// Call superclass function
super::foo(); // oops, calls Base::foo() rather than Derived::foo()
...
}
};
(如Martin York在對此答案的評論中所指出的,可以通過將typedef設置為私有而不是公共或受保護來消除此問題。)
- 3 回答
- 0 關注
- 634 瀏覽
添加回答
舉報