iks*_*nov 2 c++ oop inheritance design-patterns initialization
假设存在一个没有涉及多重继承的简单层次结构:
class base {
public:
base() { /* */ }
virtual void init() { /* */ }
};
class derived_a : public base {
public:
derived_a() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
class derived_b : public base {
public:
derived_b() { /* */ }
virtual void init() override { base::init(); /* local stuff to add */ }
};
Run Code Online (Sandbox Code Playgroud)
然后客户端代码就像
auto d_a = new derived_a{};
d_a->init();
Run Code Online (Sandbox Code Playgroud)
我看到两个问题:
a)base::init()每一个都重复derived_x::init()
b)derived_x::init()每次创建派生类对象时重复
从我的观点来看,两者都很容易被遗忘.
我知道base::base{},你base不是derived_x,因为虚拟调度在C++中是如何工作的.但是有一种解决方法,不是吗?看起来像开发人员已经多次遇到的常见问题.什么是可能的解决方案?
如果您可以强制在用户上使用工厂函数,则可以在层次结构的底部添加终结器类模板
template<typename T>
class base_finalizer : public T
{
base_finalizer()
{
this->base::init();
this->T::init();
}
};
template<typename T>
auto make_base()
{
return unique_ptr<T>(new base_finalizer<T>);
}
Run Code Online (Sandbox Code Playgroud)
如果需要,这还允许base_finalizer使用对象的最终动态类型进行一些清理.
话虽如此,总是努力使您的类型可用简单的价值语义.