2011-11-09 14 views
0

以下のコードでは、fooはタイプAオブジェクトを値で返します。私は何とかこれをB型のオブジェクトに便利なやり取りなしに変換できますか? (注:クラスAは、すべてのデータ/ストレージmebersを含み、クラスBはちょうどより多くの方法を紹介します)事前にメソッドのC++継承と戻り値

class A{ 
    /*data*/ 
    A foo(...); 
}; 

class B: public A 
{ 
/*no-data*/ 
    B doMagic(...); 
}; 

/*usage*/ 
B bone; 
B btwo = bone.foo(...) /*w\o cast*/ 

感謝を!

+3

私は正直に努力していますが、あなたがこれをどのように表現したかに基づいて、あなたが望むものを理解できません。あなたはいくつかの情報を追加してそれに言い返すことができますか? –

+0

'class B、public A'は' class B:public A'でなければなりません。また、値でオブジェクトを返す必要がありますか、返す(スマート)ポインタで生きることができますか? – bitmask

+0

私はよくあなたの質問を理解していないが、あなたは多形性のある種の必要があるように聞こえる? –

答えて

2

あなたはそれを書くことができません。また、構文エラーもあります。

実際の基底オブジェクトを派生オブジェクトに変換することはできません。また、通常は分かりづらいこともありません。いつものこと doはポインタと参照を変換します。あなたのケースでは

、あなたは一般的に、仮想関数に共変戻り値を使用します。

struct A 
{ 
    virtual A * foo(); 
}; 

struct B : A 
{ 
    virtual B * foo(); // OK, this _overrides_ A::foo() 
}; 

int main() 
{ 
    B x; 
    B * p = x.foo(); // no cast 
} 

あなたはこのアプローチを追求するとき、多くの、多くの詳細について慎重に検討する必要があります。確かに実現可能ですが、多くのことを正しく行う必要があります。あなたはおそらくB::foo()を分かりやすいものにするために、いくつかのカスタムコンストラクタが必要になります。

1

私はできないと思います。 A::fooAを返します。その定義はどのようなものなのですか? Bには余分なデータが含まれていませんが、C++がそれを知ることはできません。

選択肢のカップル、あなたはあなたの代わりに試みることができる:

は、Aパラメータから作成B contstractorを持っています。私はこれを効果的にキャストすると思います。

class B, public A 
{ 
    /*no-data*/ 
    B(const A& param); 
    B doMagic(...); 
}; 

/*usage*/ 
B bone; 
B btwo = bone.foo(...); 

それとも別の戦略は、Aパラメータに取り組んでいますdoMagic静的メソッドを作ります。私はこれの全体のポイントを想定していますと、あなたはこれらがあなたのために動作するかどうか分からないのですA::foo

class B, public A 
{ 
    /*no-data*/ 
    static B doMagic(A& param, ...); 
}; 

/*usage*/ 
B bone; 
A atwo = bone.foo(...); 
B::doMagic(atwo, ...); 

の結果にdoMagicメソッドを実行したいですが、うまくいけば、彼らは助けます。

+0

これはCスタイルですが、私はすでにそのようにしていますが、C++全体のコンセプトをねじ込みます...(コーディングガイドラインは言わないでください) – drahnr