[英]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();
警告-對於指針,如果無法nullptr
, dynamic_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.