これはおそらく変な質問ですが、私が質問するのには十分な理由があります。
私の質問の要点は、クラス階層で2レベルの派生がある例を考えると、次のとおりです。
メインベースクラス:
class Animal
{
virtual void Draw() = 0;
};
派生クラス:
class Dog : public Animal
{
virtual void Draw()
{
// draw a generic dog icon or something...
}
};
さらなる派生:
class Corgi : public Dog
{
virtual void Draw()
{
// draw a corgi icon...
}
};
Corgi
さて、クラス内から、「this」ポインターをポインターに永続的にダウンキャストし、Dog
それを別の場所にアニマルとして渡すことができるようになりたいと思っています。この別の場所は、仮想メソッドではなく、Draw
関数を呼び出してメソッドを取得できるようになります。私はこれが奇妙であることを知っていますが、繰り返しますが、私にはそれをしたいという漠然とした正当な理由があります.Dog
Corgi
さまざまなキャスティング オペレーターをすべて試しましたが、うまくいきませんでしたが、これをうまくやってのける一貫した方法はありますか? 過去に、私は適切に使用しなかったために自分自身に問題を引き起こしdynamic_cast
、その結果、ポインターに同様の状態が発生しました。今回はそれを活かせるかな。
編集: 上記の例では、私が達成しようとしていることを明確に示していない可能性があるため、実際の目標について詳しく説明します。
私は、しばらく使用してきたスクリプト システムにリンクする基本クラスの実装を登録するための省略形を達成しようとしています。スクリプト システムは基底クラスに依存していますIScriptContext
実際のコード関数へのアクセスとメンバー変数へのアクセスを容易にするため。内部的に基本クラスは、メンバー関数のアドレスとメンバー変数のアドレスを登録します。これらは、後でルックアップ テーブルを介してディスパッチ/アクセスされます。クラス派生階層の適切なサポートをスクリプト システムに追加しようとしています。これらのインターフェイスの基本クラス バージョンを分離できると、時間を節約し、プロセス全体をクリーンにすることができると考えました。利用可能な基本クラスをスクリプト インタープリターに登録します。これを実現する方法は他にもあります。たとえば、利用可能な基本クラスごとに必要なメソッドごとにクラス固有の関数ポインタを登録する方法があります (例: this->Dog::CallFunction
、this->Dog::SetMember
this->Dog::GetMember
.) しかし、インターフェイスを使用すると、後で必要に応じて少し簡単に変更できるようになると考えました。
そのすべてが何らかの意味を成すことを願っています。
ありがとう!