これは古典的だと思いますが、私の場合は問題を単純化する制約があります。C++:派生クラスにダウンキャストしてオブジェクトを拡張する
私のモジュールの入力に構造体Aがいくつか追加されていて、それにいくつかの属性を追加したいだけです。だから私はAを拡張する構造体Bを作成し、必要なものを追加します。
私はBを期待しているメソッドを呼び出すが、それをAにすると、コンパイラは満足できない。すべてのネコ科のネコがライオンではないように、オブジェクトはBsではないかもしれない。
しかし、私の場合は、属性が少ないにもかかわらず、すべてがBだと誓っています。見つからない属性は、初期化されていないとして報告できます。それは問題ありません。また、初期化する前に属性を呼び出さないことを誓います。基本的には、Aオブジェクトを入力として取得するときに最初に行うのは、A属性に基づいて計算される残りのB属性を満たすことです。 Asの属性をメモリにコピーするので、いくつかの属性を追加するだけでBsのコピーを作成する必要はありません。私はAの元の属性を修正するつもりはありません。派生した属性を計算するためにそれらを使用し、A属性と派生した属性を持つBオブジェクトを回して処理します。
例:一般的な、プロジェクト全体のFromヘッダー
:
struct Rectangle {
// Side lengths
int a,b;
}
ローカルFromヘッダ:
struct LocalRectangle : Rectangle {
int area;
}
void updateModule(Rectangle inputRect);
ローカルソースから:
私はどのようにvoid updateModule(Rectangle inputRect) {
LocalRectangle r = (LocalRectangle)inputRect;
r.area = r.a*r.b;
// More processing ...
}
これを行う ?事前に
おかげで、
チャールズ
あなたはポストコードをお願いできますか? –
多分、異なる属性を保持する 'std :: map'型のAs構造体にフィールドを追加し、A型のすべてであるBs構造体を削除することができます。 – LoPiTaL
' A'を変更できますか? – Motti