所以我有一个动态分配的基类数组。我已将其派生类的一些对象存储在数组中。
student(base)类及其派生类都具有getInfo()
函数,显然派生类已覆盖基类getInfo()
。目标是使用基类中的getinfo
函数,然后将派生类的两个对象类型化为类,返回派生类并使用覆盖的getinfo()
。
一切达到“休息”的效果都很完美。它正在弄清楚如何键入将对象强制转换为导致类杀死我的派生类。
我发现了一些可能的问题:
1)我没有正确动态分配。很可能是因为我讨厌指针而且非常厌恶它们。
2)我不知道我在做什么类型的铸造。
注意事项:
1)基类getinfo不是虚拟的
2)我不允许修改基类。
所以,令人困惑的代码救星。怎么说你?你能帮助这个可怜的学生吗?
EDIT !!!
更新了代码,现在不允许“从学生**到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;
}
答案 0 :(得分:6)
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;
如果没有这个,属于派生类的所有数据都将丢失,并且仅存储基类数据,这称为对象切片。
答案 1 :(得分:0)
要使多态性起作用,您需要使用指向对象的指针。当你这样做
classRoom[1] = gst1;
C ++正在classRoom [1]中存储GradStudent对象的Student部分。