如何在基类的子类中强制执行私有构造函数

How to enforce private constructors in children of a base class

本文关键字:强制执行 构造函数 子类 基类      更新时间:2023-10-16

我想强制基类的子类具有私有构造函数。然后我希望通过友类调用这些构造函数,友类是工厂类。这是我的使用模式:

我有一个类Base:

class Base:
    virtual double method1();

我想让Child继承Base:

class Child::Base :
  public:
    Child(string s) {
       //do something
    }
    double method1() {
          return field1;
    }
  private:
     double field1;
}

通过解析string来创建Base的子节点。所以我可以有一个Base的构造函数它接受一个string。但是我不能把构造函数设为虚函数,从而不强制执行参数。

因此,为了确保Base的孩子只能从输入string创建,我希望Base的孩子从工厂类实例化。我的问题是没有什么可以阻止某人单独实例化Child。因此,我想强制Base的子类的构造函数是私有的,然后将工厂类作为友类。

任何想法?欢迎对设计提出意见。

PS:从字符串到Child的实例对于每个孩子来说都是不同的。

您可以禁止创建派生类,不是通过强制它们的构造函数是私有的,而是通过强制它们是抽象的。下面是一个工作示例:

class A
{
    private:
        struct secret{};
        virtual void impossible(secret) = 0; // cannot override this in subclasses
                                             // because the parameter type is private
        template <class X> class AImpl : public X
        {
            void impossible(secret) {}; // a nested class can access private members
        };
        template<class X> friend X * AFactory();
    public:
        virtual ~A() {}
};
class B : public A
{
    // void impossible(A::secret) {}; -- can't do that, A::secret is private!
};
template <class X>
X * AFactory()
{
    return new A::AImpl<X>;
};
int main ()
{
    // B b; -- can't do that, B is abstract!
    B* pB = AFactory<B>(); // Ok
}