use*_*652 18 c++ inheritance templates design-patterns
我最近看到了以下C++代码片段
template <class B>
class A : public B
{
...
};
Run Code Online (Sandbox Code Playgroud)
我想知道这样的设计在哪种设置中是好的做法?
我理解它的方式是,将超类作为模板参数允许A的用户在实例化A的对象时选择超类.
但是如果是这种情况,那么为所有用作模板参数并具有A扩展C的类(B)的公共超类C不是更好吗?
听起来像是包装类的一个很好的候选者:
class base {
public:
virtual void f() = 0;
};
class d1 : public base {
public:
virtual void f() override { ... };
};
class d2 : public base {
public:
virtual void f() override { ... };
};
template <typename T>
class wrapper : public T {
public:
virtual void f() override {
pre_op();
T::f();
post_op();
}
private:
void pre_op() { ... }
void post_op() { ... }
}
int main(int, char**) {
wrapper<d1> w1;
}
Run Code Online (Sandbox Code Playgroud)
例如,包装类可以提供对派生类的同步访问。