如何在基类的子类中强制执行私有构造函数
How to enforce private constructors in children of a base class
我想强制基类的子类具有私有构造函数。然后我希望通过友类调用这些构造函数,友类是工厂类。这是我的使用模式:
我有一个类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
}
相关文章:
- enable_if转换构造函数(静态强制转换,is_base_of)
- 强制使用默认构造函数对成员进行未初始化的声明
- 无法在构造函数中执行设置元素插入
- 运算符 new 的执行顺序和构造函数的参数
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 了解类构造函数的静态强制转换
- 在构造函数中删除后继续执行
- C++根据调用的构造函数强制编译时错误
- 在执行new期间是否可以在构造函数中传递不同的参数?
- 当"moved"对象在联合中具有"non-trivial"成员时,为什么强制复制构造函数?
- C++:程序的执行(构造函数、析构函数、赋值运算符等)
- C++类组合 - 何时执行构造函数和析构函数
- 强制调用构造函数而不是函数式强制转换
- 如何在基类的子类中强制执行私有构造函数
- 在C++中执行构造函数
- C++ 此指针不执行构造函数
- Visual Studio 2013 - C++,强制转换构造函数,"没有运算符"break"匹配这些操作数
- 如何强制在构造函数中调用函数
- 当执行强制转换时,调用新类型的构造函数
- 如何强制执行复制 elision,为什么它不适用于已删除的复制构造函数?