C++ C++;将基础对象转换为派生对象的类型

C++ C++;将基础对象转换为派生对象的类型,c++,C++,所以我有一个动态分配的基类数组。我在数组中存储了它的派生类的一些对象 student(base)类及其派生类都有一个getInfo()函数,显然派生类已经覆盖了该basegetInfo()。目标是使用基类中的getinfo函数,然后将派生类的两个对象键入class,返回到派生类中,并使用重写的getinfo() 每件事都是完美的。它正在弄清楚如何将对象类型转换回派生类,这让我很头疼 我已经确定了几个可能的问题: 1) 我没有正确地动态分配。很可能,因为我讨厌指针,而且非常讨厌指针 2) 我不知道

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

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

每件事都是完美的。它正在弄清楚如何将对象类型转换回派生类,这让我很头疼

我已经确定了几个可能的问题:

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

2) 我不知道我在做什么,关于实际类型铸造

有几点值得注意:

1) 基类getinfo不是虚拟的

2) 我不允许修改基类

因此,混乱代码的救世主。你说呢?你能帮助这个可怜的学生吗

编辑

更新代码,现在“不允许从学生**向研究生*进行静态\u转换”

#包括
#包括“Gradustudent.h”
#包括“本科生.h”
int main()
{
int-arraySize=3;
学生*教室[排列];
研究生gst1(“Ta”,“Da”,“4444”,“A”,“死亡”);

cout
dynamic\u cast
返回已转换的指针,它不修改参数本身

你需要像下面这样做

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

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;

否则,属于派生类的所有数据都将丢失,并且仅存储基类数据,这称为对象切片

,要使多态性发挥作用,您需要使用指向对象的指针。当您这样做时

classRoom[1] = gst1;

C++正在教室[1]中存储GradStudent对象的Student部分。

Oops,我现在实际上正在使用static\u cast。也不起作用(我只是出于恼怒而对其进行随机投射)@user2036101同样的行为,返回值是casted pointerOk,所以它现在可以工作了,除了打印类型casted对象外,我得到了一个奇怪的错误,这更像是两个派生对象的混合。@user2036101请查看我的编辑,您有一个对象切片问题。好的,知道我在哪里可以阅读对象切片以备将来参考吗e?还有**意味着什么?那么我到底做错了什么?我在指针方面整体上很弱。@Karthik解释得很好。“所以我有一个动态分配的基类数组。”不。你有一个指向基类对象的指针数组。
Student* classRoom[3];

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