クライアントコードで使用すべきではない内部オブジェクトがあります:
class InternalA {};
class InternalB {};
パブリック インターフェイス オブジェクト A、B、C があります。内部的には、A から InternalA、B から InternalB というオブジェクトを構築する必要がありますが、A と B には、基本クラス C へのポインターによってのみアクセスできます。共変仮想メソッドを使用できますが、したがって、私の内部は公開され、InternalA と InternalB は実際には同じ基本クラスの 2 つのサブタイプではありません。または私はそのようなことをすることができます:
class C {
// some data
public:
C() {};
// some pure virtual methods and virtual methods
virtual C *getConcrete(void) const =0;
};
class B : C {
public:
//methods
virtual B *getConcrete(void) { return static_cast<B>(this); };
};
class A : C {
public:
//methods
virtual A *getConcrete(void) { return static_cast<A>(this); };
};
次に、A または B パラメータでポリモーフィック メソッドを使用して内部ビルダーを使用します。
編集:InternalAとInternalBを構築するには、そのような関数/メソッドを使用できます:
void somefunction(A *a) {
InternalA x(<using a->smthg>);
// do stuffs
};
void somefunction(B *b) {
InternalB x(using b->smthg>);
//do stuffs
};
このハックについてどう思いますか?