2012-02-20 2 views
6

私はこのように見える存在していたクラスや機能があります。C++:関数呼び出し中にベクトル<derived_class>をベクトル<base_class>にキャストできますか?私は渡すことができ、機能<code>Func</code>を変更せずに、今</p> <pre><code>Class derived_class: public base_class{ ... } </code></pre> <p>:

Class base_class{ 
    ... 
} 

void Func(...,vector<base_class> &vec_b,...){ 
    // inside the function, the vector vec_b is being re-organized and re-sized 
} 

を、私は次のようになります派生クラスを定義しFuncvector<derived_class>、EX:

void main(){ 
    vector <derived_class> d; 
    Func(...,d,...); 
} 

ように派生クラスdは同じ再構成とサイズ変更を受けますか? 関数呼び出しで、派生クラスを基底クラスにキャストすることはできますが、問題なくベクトルを使用できるようになると、難しそうですね。私は答えをオンラインで見つけることができないので、どんな提案や助けも大歓迎です。ありがとう。

+2

あなたのベクトルはポインタではなく値でオブジェクトを保持しているので、多態性の動作をとることはできません。私は、何がポイントですか? – ildjarn

+0

関連:http://stackoverflow.com/a/114883/8747。 –

+0

多少関連性の高いもの:[http://www2.research.att.com/~bs/bs_faq2.html#conversion](https://www2.research.att.com/~bs/bs_faq2.html#conversion) –

答えて

0

2つのクラスのサイズが異なる場合、基底クラスのベクトルを派生クラスのベクトルに置き換えることはできません。これは、ベクトルが内部的に型の連続したインスタンスを格納するため、基底のベクトルは2番目の要素が実際とは異なる場所にあると考えてしまうからです。しかし、ポインタのベクトルを使うことができます。

+0

funcを変更する必要はありませんか? – MikMik

2

いいえ、異種のベクター間での変換はできません。しかし、Funcをテンプレートにすることで、何をしようとしているのかを達成することができます。おそらく、実際の関数本体のコードを変更する必要はありませんが、あなたが何をしているかによって異なります。 AはBであっても

template<typename T> 
void Func(..., vector<T> &vec_b, ...){ 
    // inside the function, the vector vec_b is being re-organized and re-sized 
} 
+2

OPは「Funcを変更しないで」と言った。 –

3

号は、vector<A>vector<B>ありません。

もう一方の代わりに1を渡すには、ポインタのベクトルを渡すことができます(または、Boost ptr_vectorを使用します)。あるいは、テンプレートを使用して、適切なインターフェースを提供するベクターを渡すことができます。

これらのどちらでも機能を変更する必要があります。それを避ける方法は基本的にありません。

+1

*あなたはポインタのベクトルを渡すことができます*ここで大丈夫ですか? –

+0

@BartekBanachewicz: 'ベクトル'は 'ベクトル'に変換できません。しかし、 'ベクトル'のポインタは、ベースオブジェクトまたは派生オブジェクトを指すことができます。しかし、もしあなたが 'ベクトル'で始まっていれば、そのポインタを関数に渡す前にそれらのポインタを 'ベクトル'にコピーすることができます。 –

+0

ああ、あなたが今何を意味しているのか分かります。 –

2

あなたはvector <base_class*>を取り、derived_classインスタンスにvector <base_class*>ポイントのポイント要素を聞かせFuncさせることができます。

2

これは、ポインタを使用している場合にのみ機能します。

ポインタを使用していない場合は、スライスする可能性があります。例えば。

class Base { 
    protected: 
    int foo; 
}; 

class Child : public Base { 
    int bar; 
}; 

class Basefooと呼ばれるだけ単一のintが含まれており、class Childは2つのint、foobarが含まれています。

Child f; 
Base sliced = (Child)f; 

これにより、子がスライスされ、オブジェクトからデータの一部が削除されます。ポインタを使用しない限り、親を子クラスにキャストすることはできません。

したがって、vector<>にクラスのインスタンスの代わりにポインタを持つように変更した場合、親子の間で前後にキャストできます。

のようなものの使用:

vector<Base*> vec; 
vec[0] = static_cast<Base*>(new Child()); 

... 
Func(vec); 
... 

すると、その子クラスにあなたのベクトルのメンバーをキャストすることができるようになります。

関連する問題