2012-06-30 19 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,或者您尚未意识到的其他未来类型。

相关问题