所以我有一个动态分配的基类数组。我在数组中存储了它的派生类的一些对象。

学生(基)类及其派生类都有一个 getInfo() 函数,显然派生类已经覆盖了基 getInfo() 。目标是使用基类中的 getinfo 函数,然后将派生类的两个对象输入 class ,返回派生类并使用覆盖的 getinfo()

直到“打破”的一切都完美无缺。它正在弄清楚如何将对象类型转换回派生类,这让我很沮丧。

我已经确定了一些可能的问题:

1)我没有正确动态分配。很有可能,因为我讨厌指针并且非常讨厌它们。

2)我不知道我在实际类型转换方面做了什么。

一些注意事项:

1) 基类 getinfo 不是虚拟的

2)我不允许修改基类。

所以,困惑代码的救星。你说什么?你能帮助这个可怜的学生吗?

编辑!!!

更新了代码,现在“不允许从学生 ** 到研究生 * 进行 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;
}

最佳答案

dynamic_cast 返回转换后的指针,它不会修改参数本身。

您需要执行以下操作。

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

警告 - 对于指针,如果无法转换 dynamic_cast 将返回 nullptr ,您需要检查以防止崩溃。

编辑:代码中的主要 Object slicing 错误 - #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;

没有这个,属于派生类的所有数据都将丢失,只存储基类数据,这称为 对象切片

10-08 07:54
查看更多