4

したがって、動的に割り当てられた基本クラスの配列があります。派生クラスのいくつかのオブジェクトを配列内に格納しました。

学生(基本)クラスとその派生クラスにはすべてgetInfo()関数があり、明らかに派生クラスはその基本をオーバーライドしていますgetInfo()。目標はgetinfo、基本クラスの関数を使用してから、派生クラスの2つのオブジェクトを型クラスに戻し、派生クラスに戻し、オーバーライドされたを使用することgetinfo()です。

「休憩」までのすべてが完璧に機能します。オブジェクトを派生クラスに型キャストして戻す方法を理解しているので、私は殺されます。

考えられる問題をいくつか特定しました。

1)動的に正しく割り当てられませんでした。私はポインターが嫌いで、ポインターを非常に嫌うので、非常に可能です。

2)実際の型キャストに関してImが何をしているのかわかりません。

注意すべきいくつかのこと:

1)基本クラスのgetinfoは仮想ではありません

2)基本クラスを変更することは許可されていません。

だから、紛らわしいコードの救世主。何て言うの?このかわいそうな生徒を助けてくれませんか。

編集!!!

コードを更新し、「Student**からGradstudent*へのStatic_castは許可されていません」を取得するようになりました

#include <iostream>

#include "GradStudent.h"
#include "UndergradStudent.h"

int main()
{
    int arraySize = 3;
    Student* classRoom[arraySize];

    GradStudent gst1("Ta", "Da", 4444, 'A', "Death");
    cout << gst1;

    UndergradStudent ust1("Bluh", "Bluh", 2222, 1);
    cout << ust1;

    Student bst1( "Blah", "Blah", 1111 );

    classRoom[0] = &bst1;
    classRoom[1] = &gst1;
    classRoom[2] = &ust1;



    for (int x = 0; x < arraySize; x++)
    {
        cout << classRoom[x]->getInfo();
        cout << endl;
    }

    cout << "TEST" << endl;

    GradStudent* gStudent =  static_cast<GradStudent*>(&classRoom[2]);
    cout << gStudent->getInfo();



    return 0;
}
4

2 に答える 2

6

dynamic_castキャストされたポインターを返しますが、パラメーター自体は変更しません。

以下のようなことをする必要があります。

// removed the & since the elements are now pointers
GradStudent* gStudent =  dynamic_cast<GradStudent*>(classRoom[1]); 
cout << gStudent->getInfo();

警告 - ポインターの場合、キャストに失敗するdynamic_castと が返さnullptrれるため、クラッシュを防ぐためにこれを確認する必要があります。

編集: コード内の主要なオブジェクト スライスバグ - #1 はほぼ正しい

int arraySize = 3;
Student *classRoom;
classRoom = new Student[arraySize];

GradStudent gst1("Ta", "Da", 4444, 'A', "Death");
...
classRoom[0] = gst1;

する必要があります

int arraySize = 3;
Student **classRoom;
//      ^
classRoom = new Student*[arraySize];
//                     ^
GradStudent gst1("Ta", "Da", 4444, 'A', "Death");

classRoom[0] = &gst1;
//             ^

あるいは単に

Student* classRoom[3];

GradStudent gst1("Ta", "Da", 4444, 'A', "Death");
...
classRoom[0] = gst1;

これがないと、派生クラスに属するすべてのデータが失われ、基本クラスのデータのみが保存されます。これをオブジェクトのスライスと呼びます。

于 2013-02-19T02:46:26.320 に答える
0

ポリモーフィズムを機能させるには、オブジェクトへのポインターを使用する必要があります。あなたがするとき

classRoom[1] = gst1;

C++ は、GradStudent オブジェクトの Student 部分を classRoom[1] に格納しています。

于 2013-02-19T02:54:10.807 に答える