【发布时间】:2014-11-02 10:56:16
【问题描述】:
我有一个基类Animal 和两个派生类Bird 和Fish。我有两个虚函数,Animal 中的fly(int) 和swim(int) 分别对应Bird 和Fish。 Animal中有一个常用函数aliveSince()
class Animal{
public:
Animal() {
age = 0;
}
virtual ~Animal(){}
static Animal* factory(int type);
int aliveSince(){
return age;
}
virtual int fly(int m){} //error, needs a return value
virtual int swim(int m){} //error, needs a return value
private:
int age;
};
class Bird: public Animal{
public:
Bird(){
totalFlight = 0;
}
int fly(int m){
cout<<"Bird flew "<<m<<" metres\n";
return totalFlight = totalFlight+m;
}
private:
int totalFlight;
};
class Fish: public Animal{
public:
Fish(){
totalSwim = 0;
}
int swim(int m){
cout<<"Fish swam "<<m<<" metres underground\n";
return totalSwim = totalSwim + m;
}
private:
int totalSwim;
};
Animal* Animal::factory(int type){
if (type) return new Bird();
else return new Fish();
}
我想像这样使用这些类:
Animal *a = Animal::factory(1); //Bird
Animal *b = Animal::factory(0); //Fish
a->aliveSince();
b->aliveSince();
a->fly(5);
b->swim(5);
我在 MS VC++ 中编译,它会产生错误,Animal::fly 和 Animal::swim 需要返回值。但是,这在 GNU C++ 中编译得很好。
如何在无需在虚拟方法中指定返回值的情况下摆脱错误?
请注意,我不能使这些函数纯虚拟,因为它会使 Animal 类抽象,所有派生类都需要实现 fly() 和 swim()
【问题讨论】:
-
你可能想写
virtual int fly(int m) = 0; -
在这种情况下它不会使
Animal类抽象,这是我做不到的吗?我已经在问题陈述中指定了这一点。 -
"请注意,我不能将这些函数设为纯虚函数,因为这会使 Animal 类抽象化" 那么您必须返回一些合理的默认值。
标签: c++ oop object design-patterns