C++ では、次のクラス階層を想定しています。
class BaseClass { };
class ChildClass : public BaseClass { };
さらに、共通のテンプレート化された基本クラスを持つこれら 2 つのクラスのファクトリ クラスを想定します。
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
フィールドが異なるため異なることに注意してください。
ChildClassFactory
に(または)のインスタンスがある場合、Factory<ChildClass>
安全にFactory<BaseClass>
(経由で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