从派生类实现基类构造函数专用化的替代方法是什么

What is an alternative way to implement specialization of a base class constructor from a derived class?

本文关键字:方法 是什么 专用 派生 实现 基类 构造函数      更新时间:2023-10-16

鉴于以下伪代码类,我想从派生类中专门化基类的构造函数。

class Entity
{
    public:
    Entity(float mass);
    virtual float PerformCalculation();
}
class SpecializedEntity : public Entity
{
    public:
    SpecializedEntity(float mass, float diameter);
    virtual float PerformCalculation() override;
}

鉴于在两个类的构造函数中,需要从每个类的构造函数中调用PerformCalculationPerformCalculation,我需要对我的系统进行一次 API 调用,它允许我指定仅在 SpecializedEntity 中出现的 diameter 参数。在基类Entity中,我只是传入nullptr

在不修改 PerformCalculation 中的大量代码的情况下,还有什么比以下方法更好的方法呢?

class Entity
{
    public:
    Entity(float mass, bool initialize)
    {
        if (initialize) this->Initialize();
    }
    virtual void Initialize();
    virtual float PerformCalculation();
}
class SpecializedEntity : public Entity
{
    public:
    SpecializedEntity(float mass, float diameter) : diameter(diameter), Entity(mass, false)
    {
        this->Initialize();
    }
    virtual void Initialize() override;
    virtual float PerformCalculation() override;
}

我将为我的同事回复,因为他看到了这个并告诉我一个简单的解决方案,它更好,但仍然不理想。这也将有助于说明我的观点,并为更好的答案留出空间。

解决方案是让所有派生类从其构造函数调用this->Initialize,而不是允许基类调用它,因为应该没有任何理由使用该基类。

class Entity
{
    protected:
    Entity(float mass)
    { }
    virtual void Initialize();
    public:
    virtual float PerformCalculation();
}
class SpecializedEntity : public Entity
{
    public:
    SpecializedEntity(float mass, float diameter) : Entity(mass)
    {
        this->Initialize();
    }
    virtual void PerformCalculation() override
    {
        // Do specific stuff here
    }
}

PerformCalculation 是从 Initialize 内部调用的,因此一旦从派生类调用,它将使用更专业的PerformCalculation