簡體   English   中英

C ++類型轉換基礎對象到派生對象

[英]C++ Type casting base object to derived object

所以我有一個動態分配的基類數組。 我已經將其派生類的一些對象存儲在數組中。

學生(基礎)類及其派生類均具有getInfo()函數,顯然,派生類已覆蓋該基礎getInfo() 目標是使用基類中的getinfo函數,然后將派生類的兩個對象鍵入class,返回派生類,並使用重寫的getinfo()

直到“中斷”為止的所有工作都完美。 它正在弄清楚如何將對象類型轉換回派生類,這使我喪命。

我發現了一些可能的問題:

1)我沒有正確地動態分配。 很有可能,因為我討厭指針並且非常討厭它們。

2)我不知道我對實際類型轉換做了什么。

注意事項:

1)基類getinfo不是虛擬的

2)我不允許修改基類。

因此,避免了混亂的代碼。 你說什么 你能幫這個可憐的學生嗎?

編輯!!!

更新的代碼,現在不允許“ Static_cast從Student **到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;
}

dynamic_cast返回強制轉換的指針,它不會修改參數本身。

您需要執行以下操作。

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

警告-對於指針,如果無法nullptrdynamic_cast將返回nullptr ,您需要檢查此項以防止崩潰。

編輯:代碼中的主要對象切片錯誤-#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

為了使多態性起作用,您需要使用指向對象的指針。 當你做

classRoom[1] = gst1;

C ++將GradStudent對象的Student部分存儲在classRoom [1]中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM