如果您甚至不能修改派生類,那麼很難在他們不知道的情況下調用GetInfo,它們是特定類型的。也許你需要使用直接的解決方案:
GradStudent gradStudent;
cout << gradStudent.GetInfo();
或者你可以嘗試檢查,如果學生指定的派生類的,但IMO這是非常醜陋的和危險的(在擴展代碼而言):
for (int i = 0; i < 3; i++)
{
GradStudent * gs = dynamic_cast<GradStudent *>(classRoom[i]);
if (gs != nullptr)
cout << gs->GetInfo();
else
{
UndergradStudent * ugs = dynamic_cast<UndergradStudent *>(classRoom[i]);
if (ugs != nullptr)
cout << ugs->GetInfo();
else
cout << classRoom[i]->GetInfo();
}
}
我不得不說,多態是專門爲處理像這樣的情況而創建的,並且GetInfo在基類中不是虛擬的是嚴重的架構缺陷。
此外:如果您在玩指針,請避免將地址複製到局部變量。這可能是危險的。相反,分配和取消分配手動內存:
classRoom[0] = new Student;
classRoom[1] = new GradStudent;
classRoom[2] = new UndergradStudent;
// Process data
for (int i = 0; i < 3; i++)
delete classRoom[i];
邊緣:我討厭像任務:做X,而無需使用Y(其中Y爲專門設計來解決X)。
編輯:(響應評論)
你問,虛函數將如何解決這個問題。假設有一段時間,Student::GetInfo
是虛擬的。讓我們分析下面的幾段代碼:
Student * student = new Student;
student->GetInfo(); // Student::GetInfo is called
GradStudent * gradStudent = new GradStudent;
gradStudent->GetInfo(); // GradStudent::GetInfo is called
現在沒什麼讓人驚訝的。
Student * student = new GradStudent;
student->GetInfo();
// if Student::GetInfo is virtual, GradStudent::GetInfo is called here
// if Student::GetInfo is not virtual, Student::GetInfo is called here
現在仔細閱讀。如果Student::GetInfo
是虛擬的並且在GradStudent
類中實現,則將調用GradStudent::GetInfo
,儘管事實上它被稱爲Student
變量。 但是,如果Student::GetInfo
不是虛擬,在以前的情況下,Student::GetInfo
將被調用。這基本上是虛擬功能的工作原理。
就你而言,你有一個Student *變量數組 - 你並不完全知道它們是否是Student
s,GradStudent
s或UndergradStudent
s。由於您的Student::GetInfo
不是虛擬的,所以在這些變量上調用此方法將始終導致調用Student::GetInfo
,無論它們的實際類型如何。
在這種情況下,我能想到的唯一的解決辦法是設法猜測,其實它們是類:
Student * student = new UndergradStudent;
Student * s = student; // Ok
GradStudent * gs = dynamic_cast<GradStudent *>(student); // Not true, will return NULL/nullptr
UndergradStudent * ugs = dynamic_cast<UndergradStudent *>(student); // Ok
這樣,您就可以恢復到原來的類型,並調用實際的變量類型的GetInfo
。
請注意,這是一個醜陋的解決方案,這種問題可以通過虛擬函數來解決。
C++ FAQ是進一步瞭解虛擬功能的好地方。
這不起作用?它看起來應該。有什麼問題? (儘管這樣做很愚蠢) – Pubby 2013-02-14 10:23:56
只要'getInfo'是'virtual' - 它應該是,因爲它在基類中,所以你不能改變 - 這應該可以工作。那究竟是什麼問題? – Jon 2013-02-14 10:24:15
向我們展示來自Student,GradStudent和UndergradeStudent的類定義,並指定您在代碼中遇到的問題 – 2013-02-14 10:25:09