繁体   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