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

Posted

技术标签:

【中文标题】C++ 类型将基础对象转换为派生对象【英文标题】:C++ Type casting base object to derived object 【发布时间】:2013-02-19 02:43:52 【问题描述】:

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

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

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

我发现了一些可能的问题:

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

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

注意几点:

1) 基类 getinfo 不是虚拟的

2) 我不能修改基类。

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

编辑!!!

更新代码,现在得到“Static_cast from Student ** to Gradstudent * is not allowed”

#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】:

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;

没有这个,所有属于派生类的数据都会丢失,只存储基类数据,这叫做Object Slicing

【讨论】:

糟糕,我现在实际上正在使用 static_cast。也无法正常工作(我只是出于烦躁而随意投掷) @user2036101 相同的行为,返回值是强制转换的指针 好的,它现在可以工作了,除了当我打印出类型转换的对象时,我得到一个奇怪的错误,这更多是两个派生对象的混合。 @user2036101 请看我的编辑,你有一个对象切片问题。 好的,知道我可以在哪里阅读对象切片以供将来参考吗?还有**是什么意思?【参考方案2】:

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

classRoom[1] = gst1;

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

【讨论】:

那么我到底做错了什么?总的来说,我的指针很弱。 @Karthik 解释得很好。

以上是关于C++ 类型将基础对象转换为派生对象的主要内容,如果未能解决你的问题,请参考以下文章

C++:将派生指针转换为 void 指针,然后转换为抽象指针,并访问成员函数

QML/QT 如何将对象从 C++ 转换为 QML?

C ++如何使用派生对象中的独立基础对象

C++中四种转换类型的区别

Part7 继承与派生 7.3基类与派生类类型转换

NET基础:类型转换