У меня есть базовый класс Animal
и два производных класса Bird
и Fish
. У меня есть две виртуальные функции: fly(int)
и swim(int)
в Animal
для Bird
и Fish
соответственно. Существует общая функция aliveSince()
в Animal
Виртуальная функция должна возвращать значение в MS C++
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» _ Затем вы должны вернуть некоторые разумные значения по умолчанию. –