0

C++ プロジェクトと C++/CLI プロジェクトを含むビジュアル ソリューションに取り組んでいます。
C++/CLI プロジェクトにクラスの階層を実装しました。

クラス D => クラス C => クラス B => クラス A

=> は : から派生したことを意味します

クラスAからクラスへのクラスDは ref クラスではありません。

クラスAには次のメソッドが含まれています。

virtual int MyMethod() const;

MyMethodクラスでも宣言および実装されていDます。

int MyMethod() const;

C++ プロジェクトで次のコードを作成しました。

A l_dObject = D();
l_dObject.MyMethod();

クラスは実行されAますが、クラスがMyMethod実行されることを期待しています。誰かが私に理由を説明してもらえますか?DMyMethod

4

2 に答える 2

2
A l_dObject = D();

オブジェクトをスライスしています: つまり、オブジェクトのA一部のコピーを作成し、その部分を破棄していますD。ポリモーフィック オブジェクトを扱うときは、基本クラスへのポインターまたは参照を使用する必要があります。例えば:

A* l_dObject = new D();

後で忘れないようdeleteに。

于 2013-06-24T18:46:12.553 に答える
2

これがスライシングと呼ばれるものです。

Aから を構築していDます。 Aおそらく からのコピー コンストラクターを提供し、存在するA知識はありませんDDをコピー コンストラクターに (as として)渡すconst A&と、コンストラクターはその方法で喜んでコピーします。ここでの作業がすべて完了すると、A. はD割り当て後に殺されます。

この問題の解決策のほとんどには、ヒープへの割り当て、およびポインター/参照が含まれます。

A *l_dObject = new D(); // allocate our D on the heap
...
delete l_dObject; // don't forget to delete afterwards
于 2013-06-24T18:49:34.037 に答える