亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C ++中使用“ super”

在C ++中使用“ super”

C++
繁花如伊 2019-11-05 15:27:38
我的編碼風格包括以下成語: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是在Java和C#中實現的,除非我錯了,否則在C#中將其稱為“基礎”。但是C ++缺少此關鍵字。所以,我的問題是:您使用的代碼中是否經常使用typedef super common / rare / never?使用typedef super是可以的嗎(即您是否出于強烈的理由不使用它)?“ super”應該是一件好事嗎,應該在C ++中進行某種標準化,還是通過typedef進行使用已經足夠了?編輯: Roddy提到了typedef應該是私有的事實。這將意味著任何派生類都必須重新聲明它才能使用它。但是我想它也會阻止super :: super鏈接(但是誰會為此哭泣?)。編輯2:現在,在大規模使用“超級”幾個月后,我完全同意羅迪的觀點:“超級”應該是私有的。我會兩次投票贊成他的回答,但我想我不能。
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

我一直使用“繼承”而不是超級。(可能是由于Delphi的背景),我總是將其設置為private,以避免在類中錯誤地省略“繼承”但子類嘗試使用它時的問題。


class MyClass : public MyBase

{

private:  // Prevents erroneous use by other classes.

  typedef MyBase inherited;

...

用于創建新類的標準“代碼模板”包括typedef,因此我幾乎沒有機會無意忽略它。


我認為鏈式的“ super :: super”建議不是一個好主意-如果這樣做,您可能很難與特定的層次結構綁定在一起,并且更改它可能會嚴重破壞某些東西。


查看完整回答
反對 回復 2019-11-05
?
青春有我

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設置為私有而不是公共或受保護來消除此問題。)


查看完整回答
反對 回復 2019-11-05
  • 3 回答
  • 0 關注
  • 634 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號