0

私は現在、仮想関数について学習しています。この特定のレッスンでは、オブジェクト ポインターの配列を作成し、firstArray[5]これらのオブジェクトから関数を呼び出します。func()今までは、オブジェクトから関数を呼び出したいときはいつでもfooと書いていfoo.func()ました。仮想関数とこの配列を使用するようになったので、この本はこの方法に切り替わりました: firstArray[0]->func(). この本は、この切り替えを正当化するのにうまく機能していません。誰か説明してもらえますか? を使用しようとすると、これが得られることがわかりfirstArray[0].func()ます....

error: request for member 'func' in 'firstArray[0]', which is of non-class type 'sampleClass*'.

実際のオブジェクトではなく、ポインターから関数を呼び出そうとしているだけですか? 私は数か月間 C++ を学んでいますが、何らかの理由でポインタがまだ時々つまずきます。説明があれば役立ちます。

編集:

私を混乱させた部分はこれだと思います..でベースオブジェクトクラスへのポインタを作成できますbase *ptr;. 次に、派生クラスから新しいオブジェクトを作成することで、そのポインターを設定できますptr = new derived;。これは私が混乱するところです。を作成しint* ptr;、作成した整数を指すようにしたい場合、 とは言えませんptr = int jptrが単なる住所である場合、これら 2 つの例の動作が異なるのはなぜですか? 「新しい」メカニズムもよくわかっていないようです。

4

1 に答える 1

5

それは仮想関数とは何の関係もありません。ポインターがある場合は、それが指しているオブジェクトを参照してアクセスするために operator-> が必要です....

演算子は引き続き使用できます。(ドット) を使用して、最初に逆参照する場合にメンバー/関数にアクセスします。

(*foo).func()

オブジェクトへのポインターは、オブジェクトがメモリ内に保持されているアドレスを保持するだけです。
したがって、ある型へのポインターである変数がある場合、実際には数値を保持します。

オブジェクトを使用したい場合は、オブジェクトが指しているオブジェクトを呼び出す必要があります。これは、operator* または operator を使用して述べたとおりです。(ドット)。

于 2013-02-05T16:01:34.967 に答える