2012-06-30 24 views
3

我試圖使用工廠方法來返回派生類,但返回類型是基類類型。根據我的理解,我認爲繼承可以讓我做到這一點,顯然我錯了。無效從BaseClass *轉換爲DerivedClass *

WeightExercise和CardioExercise都來自練習。

我可以拋出物體,但我認爲我的設計意味着我不必這樣做。有人能指出我的錯誤嗎?

主要

ExerciseFactory ExerciseFactoryObj; 
WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection); 

工廠類

class ExerciseFactory 
{ 
public: 
ExerciseFactory(); 
~ExerciseFactory(); 
Exercise* createExercise(int exercisetype); 


private: 
static WeightExercise* createWeightExercise() { return new WeightExercise(); } 
static CardioExercise* createCardioExercise() { return new CardioExercise(); } 
}; 

工廠實現

Exercise* ExerciseFactory::createExercise(int exercisetype) 
{ 
if (1 == exercisetype) 
{ 
    return this->createWeightExercise(); 
} 
else if (2 == exercisetype) 
{ 
    return this->createCardioExercise(); 
} 
else 
{ 
    cout << "Error: No exercise type match" << endl; 
} 
} 
+0

您正在將返回值分配給派生類。你必須將它分配給BaseClass * – MBen

回答

5

您可以指定從工廠返回到基類中的一個派生類:

ExerciseFactory ExerciseFactoryObj; 
Exercice *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection); 

編輯:

如果你真的需要訪問WeightExerciceObject元素使用:

WeightExerciceObject * weight = dynamic_cast<WeightExerciceObject *>(ExerciseFactoryObj.createExercise(menuselection)); 

這將返回NULL,如果類是不準確的。你需要檢查NULL。

+0

謝謝。這當然意味着我將無法訪問WeightExercise的成員? –

+1

如果你發現自己正在做很多這些dynamic_cast,你可能想要查看基類的設計。 – MBen

+0

看起來就是這樣。我認爲這就是爲什麼我應該使用接口而不是基類? –

1

在main方法,這樣的:

WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection); 

應該是這個

Exercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection); 

不能使用WeightExercise,因爲你不知道正在返回什麼演習的具體類型呢,它可能是CardioExercise或WeightExercise,或者您尚未意識到的其他未來類型。

相關問題