2013-02-19 107 views
4

所以我有一个动态分配的基类数组。我已经将其派生类的几个对象存储在数组中。C++类型铸造基础对象到派生对象

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

一切都达到“休息”的作品完美。它正在弄清楚如何将对象强制转换回派生类,这些派生类正在杀死我。

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

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

2)我不知道我在做什么实际上类型铸造。

值得注意的几件事情:

1)的基类是getinfo不是虚

2)我不允许修改的基类。

因此,混淆代码的救星。什么说你?你能帮助这个可怜的学生吗?

编辑!

更新代码,现在越来越“的static_cast从学生到** * Gradstudent不允许”

#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; 
} 
+1

“所以我有一个动态分配的基类数组。” **没有**。你有一个指向**基类对象的**指针数组。 – 2013-02-19 12:16:41

回答

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; 

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

+0

糟糕,我现在实际上使用static_cast。也没有工作(我只是抛出随机演员出来的烦恼) – user2036101 2013-02-19 02:47:24

+0

@ user2036101同样的行为,返回值是铸造指针 – 2013-02-19 02:48:05

+0

好吧,所以它现在的工作,除了当我打印出类型铸造对象,我得到一个奇怪的错误是更多的两个派生对象的混合物。 – user2036101 2013-02-19 02:53:11

0

为了使多态性正常工作,您需要使用指向对象的指针。当你这样做时

classRoom[1] = gst1; 

C++存储在classRoom [1]中的GradStudent对象的学生部分。

+0

那我究竟做错了什么?我的整体指针非常弱。 – user2036101 2013-02-19 02:56:26

+0

@Karthik解释得很好。 – 2013-02-19 02:58:44