C++:设计建议

标签 c++ templates inheritance virtual

我需要一些关于类层次结构设计的建议。我当前设计的“骨架”是

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() 是虚拟的)。

我知道这是一个糟糕的设计,因为为了拥有模板化类,模板参数必须具有相同的接口(interface)。在我的例子中,X1 和 X2 具有通用接口(interface),但 X2 具有更多功能,这会产生上述问题。我知道我可以在 X1 中创建一个什么也不做的 f2 函数,但理想情况下我想避免这种情况。

我欢迎任何改进设计的建议。提前致谢!

最佳答案

避免从具体类派生。将接口(interface)/ABC 提升到顶部,使所有具体类离开。这是针对多种设计难题的一般性建议。

在您的特定情况下,而不是这样:

             BASE    // concrete
              | 
           DERIVED

使用这个:

             BASE   // fully abstract
            /   \
BASIC_DERIVED    ADVANCED_DERIVED

现在 fBASE 中是纯虚拟的,一切都很好。

关于C++:设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17944697/

相关文章:

c++ - 如何实现可以用void实例化的智能指针?

c# - 部分类/部分方法与基类/继承类

java - Java中如何处理自引用和继承

c++ - C中的windows keydown监听器

c++ - 为什么在使用 shared_ptr 时会出现运行时异常?

c++ - 模板类中的模板函数

以类方法作为参数的 C++ 模板

java静态绑定(bind)和多态性

c++ - 从类型的右值初始化类型的非常量引用无效

c++ - CUDA 不适用于 Visual Studio 2013 - 工具包 4.2、5.5 和 6