12

仮想メソッドと基本クラスからの2つの派生クラスのみを持つ基本クラスがあり、それらの仮想メソッドが実装されている場合。

方法:

 // causes C2259
 BaseClass* base = new BaseClass[2];

 BaseClass[0] = new FirstDerivedClass;
 BaseClass[1] = new SecondDerivedClass;

また:

// causes "base is being used without being initialized"
BaseClass* base;
// causes CC59 again
BaseClass* base = new BaseClass;

base[0] = FirstDerivedClass();
base[1] = SecondDerivedClass();

(または類似のもの)

BaseClass...を介して s メソッドにアクセスできるようにしDerivedClassますが、ポインターによって、ポインターはDerivedClasss の配列ですか?

4

5 に答える 5

12

配列の型が間違っています。オブジェクトへのポインタではなく、BaseClassオブジェクトインスタンスを格納しています。抽象的であるように見えるため、コンパイラは、インスタンスをデフォルトで構築して配列を埋めることができないと不平を言います。BaseClass

BaseClass抽象的ではなかったとしても、C++ では配列をポリモーフィックに使用することは絶対に禁止さているため、いずれにしても別の方法で行う必要があります。

コードを次のように変更して、これを修正します。

BaseClass** base = new BaseClass*[2];

base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;

とはいえ、ほとんどの場合、単純な配列の代わりに使用し、ダム ポインターの代わりにstd::vectorスマート ポインター ( など) を使用することをお勧めします。std::shared_ptr手動でコードを記述する代わりにこれらのツールを使用すると、非常に小さなランタイム コストで多くの問題を透過的に処理できます。

于 2012-10-24T11:33:59.577 に答える
5

std::vector単純な配列の代わりにC++を使用します。

std::vector<BaseClass*> base;
base.push_back(new FirstDerivedClass());
base.push_back(new SecondDerivedClass());

気づいたようKerrek SBに、最も安全な方法は使用することstd::unique_ptrです:

std::vector<std::unique_ptr<BaseClass> > base;
base.push_back( std_unique_ptr<BaseClass>(new FirstDerivedClass()) );
base.push_back( std_unique_ptr<BaseClass>(new SecondDerivedClass()) );
于 2012-10-24T11:31:31.017 に答える
2

BaseClassに純粋仮想メソッドが含まれている場合、これはコンパイルに失敗します。

BaseClass* base = new BaseClass[2];

そうでない場合は、メモリリークが発生します。

C ++では、これはstd::vectorまたはstd::arrayを使用し、ある種のスマートポインターを使用して実行されます。例えば ​​:

std::vector< std::shared_ptr< BaseClass > > arr( 2 );
arr[0].reset( new FirstDerivedClass() );
arr[1].reset( new SecondDerivedClass() );
于 2012-10-24T11:36:58.297 に答える
0

ポインター配列を定義します。ポインターの型は BaseClass です。そして、配列の要素に派生クラスへのポインターを割り当てます。と同じように:

BaseClass* base [2];
base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;
于 2012-10-24T11:45:49.207 に答える
0

これが答えでした(ルビーから)

BaseClass* Base[2];

Base[0] = new FirstDerivedClass;
Base[1] = new SecondDerivedClass;
于 2012-10-24T11:43:24.133 に答える