我需要一些关于类层次结构设计的建议。我当前设计的“骨架”是
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
现在 f
在 BASE
中是纯虚拟的,一切都很好。
关于C++:设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17944697/