-2

基本クラスから派生クラスへの型キャストに問題があります (オブジェクトがその正確な型であると確信しているため、キャストしています)。これが私のコードです(簡略化):

class MyCollection 
{
public:
 Element* Get(int i) {
  return elements[i]; 
 }
 void Add(Element* element) {
   //finding i
   elements[i] = element;
 }
private:
 Element* elements[100]; 
}

class Element {
 public:
  int ID; 
}

class SpecialElement : public Element 
{
public:
 SpecialElement(char* name) { 
   this-> Name = name; 
 }
 char* GetName() { return Name; }
private:
 char* Name; 
}

追加の瞬間にブレークポイントを置き、イミディエイト ウィンドウで Add メソッドの引数をキャストして GetName メソッドを呼び出すと、SpecialElement の MyCollection オブジェクトに追加すると、オブジェクトの名前が返されますが、次のようなことをすると:

void main() {
 MyCollection coll = new MyCollection();
 coll.Add(new SpecialElement("MyName"));
 SpecialElement* foundElement = (SpecialElement*)coll->Get(0); 
 foundElement->GetName(); //Error
}

なぜだろう?タイプ SpecialElement のオブジェクトが作成されていませんか?

4

3 に答える 3

6

あなたはそれをベースにキャストし、それによってあなたのオブジェクトElementをスライスしています。ベースの一部ではないためSpecialElement、ベースから元のタイプにキャストバックするとElementデータが失われます。Name

AFAIK、あなたはあなたがしようとしていることをすることはできません。

于 2012-05-24T21:23:01.513 に答える
6
 Element* Get(int i) {
  return elements[i]; 
 }
 void Add(Element* element) {
   //finding i
   elements[i] = element;
 }

これはどのようにコンパイルされますか? Element*を にElement、またはその逆に割り当てていますが、それらはまったく別のものです。あなたの論理全体は無意味です。

参照セマンティクスと悪い文字列を想定して、動的割り当てを過剰に使用していchar*ます。C++ の本を入手してください。

また、このクラスは既に存在しstd::array<Element*, 100>ます。またはstd::vector<Element*>、動的サイズが必要な場合。

于 2012-05-24T21:22:33.863 に答える
1

コードを適切に使用Element* elements[100];および更新する必要があります。そうしないと、ポインター代入の代わりにオブジェクト代入を使用すると、多態性が失われます。

于 2012-05-24T21:26:10.837 に答える