編集:わかりましたが、これはケースを大きく変更するため、より正確なシナリオは次のとおりです。
私が現在持っている階層は、これに多少似ています。
class IBase() { virtual void Foo() = 0; };
class Base() : public IBase { virtual void Foo() { } };
class IDerived() { virtual void Bar() = 0; };
template<typename TT, typename TB, typename... TI>
class Derived : public Base, public IDerived { virtual void Bar() {}};
template<typename TT, typename TB, typename... TI>
IBase* CreateDerived() { return new Derived(); }
IBase* derived = CreateDerived<some types...>();
オブジェクトをキャストして関数を呼び出そうとすると、Visual Studio でエラーが発生します。
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
派生を介した IBase インターフェイスのすべての呼び出しは正常に機能しますが、派生を IDerived にキャストしようとすると、関数呼び出しでエラーが発生します。
IDerived* d = (IDerived*)derived;
d->Bar(); <- boom error ;)
そのようなキャストは違法だと思いますが、IDerived インターフェイス メソッドにアクセスできるようにするにはどうすればポインターをキャストできますか (できれば、dynamic_cast がなければ、適切でポータブルなハックがあればそれを使用したいと思います ;))? 適切なvtableが使用され、すべてが正常に機能するように、ポインターへのオフセットを計算することは可能ですか?
私はかなり長い間プログラミングを行ってきましたが、大量のインターフェースとテンプレートを備えた設計されたシステムに対するこれらの空想を常に回避してきましたが、今では自分で作成する運命にあります。
編集:ご覧のとおり、これはトリッキーで困難になります。テンプレート化されているため、取得している Derived の正確なタイプはわかりません。関数 CreateDerived もテンプレート化されており、インターフェイスを返します。
また、要件の 1 つは、dynamic_cast を使用しないことです (プロジェクトでは RTTI が無効になっています)。