2013-04-01 91 views
0

注意:這是家庭作業!C++與派生類成員級聯

我正在研究一個大型項目,其中我有3個(我們將關注)類,基類Student和2個派生類Grad和Undergrad,現在我永遠不會明確地使用學生類,但不幸的是創建一個包含畢業生和本科生類型轉換爲學生的鏈接列表,我的問題是如何實現級聯我的派生類,即

在我的基類我有一個小函數,在室內用本科生

基類的全覆蓋實施:

virtual UnderGrad& setMajor(std::string) {} 

本科:

//purpose: sets the major  
UnderGrad& UnderGrad::setMajor(std::string maj) 
{ 
    major = maj; 
    return *this; 
} 

即時知道如果這是正確的或者什麼的正確實施的功能的,所以我可以使用級聯像即

curStudent.setStudentNum().setMajor()...... 

是林做正確嗎?如果是的話,我的基類應該返回什麼?即

return *(new Undergrad(....)); 

編輯 回答一些問題 我只需要有保存2班畢業,本科都派生形式的學生,爲了這些列表進行排序,除其他事項外鏈表我需要訪問派生類(唯一變量),但是我把它們轉換爲學生(根據作業需要),所以爲了訪問任何類特定的數據,我需要一些虛擬方法來編寫訪問它(是的,在我看來,它似乎沒用,我可以在一個班級學生中做所有事情,我可以在這三個班但是我不能有一班)所以如果我編寫虛擬方法專門用於派生類訪問變量然後,Undergrad的構造函數確實設置了主要功能,但是如果我想要編輯任何數據,看起來多餘的是讓所有的舊數據刪除舊的節點,然後創建一個新的節點舊的數據,並在下面那裏正是我需要的,我認爲

+1

如果你想讓這兩個畢業生和本科生工作,你必須返回一個'學生&'。如果它只適用於一個,那麼在該類中執行,而不是基類。 – chris

+0

好的,這就是我開始思考如何我可以返回對基類的引用,如果即時通訊返回一個基類的引用將我的派生函數被調用或我的基地 –

+1

'return * this;'將做到這一點。 – chris

回答

1

對我來說,這聽起來像你的基類是Abstract Class評論一個新的重大

克里斯的答案。換句話說,你從來沒有實例化一類Student,它只是一個抽象和代碼共享機制。

在C++中沒有abstract的關鍵字,因爲在C#, Java等其他OO語言中存在關鍵字。但是您可以通過將函數標記爲pure virtual來實現抽象機制。爲了做到這一點,只需設置一個虛函數等於0,如

virtual UnderGrad& setMajor(std::string) = 0; 

現在,你會得到一個編譯錯誤,如果任何派生類不重寫此功能。這提供了一個合同,說:「任何派生學生,必須執行setMajor」。因此,Student類將不會執行此功能,並且不會返回任何內容,因爲該功能是abstractpure virtual

至於

curStudent.setStudentNum().setMajor()...... 

我不知道怎麼setStudentNum是否會返回一個類型學生的對象。您可能想要將它們分成兩個獨立的電話。例如。

curStudent.setStudentNum(2058937); 
curStudent.setMajor("Computer Science"); 
+0

不是我想要的設置主要是UnderGrad獨特的,我不想實現它爲Grads(這就是爲什麼它不是純虛擬),並通過返回一個參考/指向基地的指針我可以級聯而不需要單獨的函數調用 –

+1

@AndrewOtsuki,除非'Student'中有一個默認的實現,否則你必須避開'setMajor'只能在鏈的起始位置的不一致性。適用於'畢業生'。如果'畢業生'不應該'setMajor',它應該只出現在'本科'。 – chris

+0

啊我有一個變量持有學位類型與我檢查,是的,這聽起來是正確的,我已經實施級聯,當我被允許2個不同的名單,並認爲這一個ty –