簡體   English   中英

C ++:設計建議

[英]C++: design advice

我需要一些有關類層次結構設計的建議。 我當前設計的“骨架”是

template <class X>
class BASE {
  public:
    virtual void f() {
        x_.f2(m_);
    }

    void g() {
        /* do stuff here*/
        x_.g();
    }

    /* more member functions here*/

  protected:
    X x_;
    int m_;
};

template <class X>
class DERIVED : BASE<X> {
    public:
      virtual f() override {
         x_.f1();
      }

     protected:
     using BASE<X>::x_;
     using BASE<X>::m_;
};

最后我又有兩個這樣的課程

struct X1 {
  void f1();
  void g();
};

struct X2 : X1 {
void f2(int m);
};

我希望能夠創建DERIVED<X1>的實例。 為此,編譯器將首先創建BASE<X1>的實例,在這種情況下,它將抱怨X1沒有成員函數f2(盡管實際上它永遠不會被調用,因為調用函數f()是虛擬)。

我知道這是一個糟糕的設計,因為要擁有模板化的類,模板參數必須具有相同的接口。 在我的情況下,X1和X2具有公共接口,但是X2具有更多功能,從而產生了上述問題。 我知道我可以在X1中創建一個不執行任何操作的f2函數,但理想情況下,我希望避免這種情況。

我歡迎任何改進設計的建議。 提前致謝!

首要建議是不要使用受保護的屬性。 正在打破封裝。

第二種建議是使virtual void f()=0完全不執行而成為純虛virtual void f()=0 這樣,派生類就不會有錯誤。

避免派生出具體的類。 將接口/ ABC提升到頂部,使所有具體類都離開。 這是針對許多設計難題的一般建議。

在您的特定情況下,請執行以下操作:

             BASE    // concrete
              | 
           DERIVED

用這個:

             BASE   // fully abstract
            /   \
BASIC_DERIVED    ADVANCED_DERIVED

現在fBASE是純虛擬的,一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM