如何在C++中创建多态和附加的init()函数?

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++中是如何工作的.但是有一种解决方法,不是吗?看起来像开发人员已经多次遇到的常见问题.什么是可能的解决方案?

krz*_*zaq 5

如果您可以强制在用户上使用工厂函数,则可以在层次结构的底部添加终结器类模板

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使用对象的最终动态类型进行一些清理.

话虽如此,总是努力使您的类型可用简单的价值语义.