在 C++ 中,假设以下类层次结构:
class BaseClass { };
class ChildClass : public BaseClass { };
进一步假设这两个类的工厂类具有一个通用的模板化基类:
template<typename T>
class Factory {
public:
virtual T* create() = 0;
};
class BaseClassFactory : public Factory<BaseClass> {
public:
virtual BaseClass* create() {
return new BaseClass(&m_field);
}
private:
SomeClass m_field;
};
class ChildClassFactory : public Factory<ChildClass> {
public:
virtual ChildClass* create() {
return new ChildClass(&m_field);
}
private:
SomeOtherClass m_field; // Different class than SomeClass
};
请注意, 和 的大小/内部结构因字段不同ChildClassFactory
而BaseClassFactory
有所不同。
现在,如果 a 有ChildClassFactory
(or Factory<ChildClass>
) 的实例,我可以安全地将它转换为Factory<BaseClass>
(via reinterpret_cast
) 吗?
Factory<ChildClass>* childFactory = new ChildClassFactory();
// static_cast doesn't work - need to use reinterpret_cast
Factory<BaseClass>* baseFactory = reinterpret_cast<Factory<BaseClass>*>(childFactory);
// Does this work correctly? (i.e. is "cls" of type "ChildClass"?)
BaseClass* cls = baseFactory->create();
我知道你不能总是以这种方式转换模板类,但在这种特殊情况下,转换应该是安全的,不是吗?
我已经用 Visual C++ 2010 对其进行了测试,它确实有效。我现在的问题是这是否可以移植到其他编译器?
更新:由于存在一些混淆,让我澄清一下在我的示例中什么(应该是)重要的:
ChildClass
是一个子类BaseClass
- 的用户
Factory<BaseClass>
不知道BaseClass
将创建哪个子类。他只知道那BaseClass
是被创造出来的。 Factory<T>
没有自己的字段(除了 vtable)。Factory::create()
是virtual