以下代码给出了错误。
错误:覆盖'virtual void Animal :: getClass()',其中显示virtual void getClass(){cout<< “我是动物”<< ENDL; }
错误:为'virtual int Dog :: getClass()'指定的冲突返回类型,其中它表示getClass(){cout<< “我是一只狗”<< ENDL; }
另外,它说:
类'Dog'具有虚方法'getClass'但非虚析构函数
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include<sstream>
#include <stdlib.h> // srand, rand
#include <stdio.h>
using namespace std;
class Animal{
public:
void getFamily(){ cout << "We are animals " << endl;}
virtual void getClass() { cout << "I'm an animal" << endl; }
};
class Dog : public Animal{
public:
getClass(){ cout << "I'm a dog" << endl; }
};
void whatClassAreYou(Animal *animal){
animal -> getClass();
}
int main(){
Animal *animal = new Animal;
Dog *dog = new Dog;
animal->getClass();
dog->getClass();
whatClassAreYou(animal);
whatClassAreYou(dog);
return 0;
}
答案 0 :(得分:5)
将类Dog中的定义更改为:
void getClass() { /* ... */ }
当您声明它没有返回类型时,编译器将返回类型设置为int。这会产生错误,因为overriden方法必须具有与它重写的基类方法相同的返回类型。
答案 1 :(得分:2)
您正在尝试声明没有返回类型的函数,这在旧版本的C ++中是允许的。但是ISO C ++标准不允许这样做(虽然有些编译器可能仍然允许,我猜想Codegear C ++ Builder 2007根本没有显示任何错误或警告)。标准中提到了 - §7/ 7脚注78和§7.1.5/ 2脚注80:隐含的禁止。
这就是它被丢弃的原因:
void HypotheticalFunction(const Type);
在这个函数中,什么是参数类型 - 类型为 Type 的const参数或类型为 const int 的参数,名称为Type?
以下是如何定义班级的更好版本:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include<sstream>
#include <stdlib.h> // srand, rand
#include <stdio.h>
using namespace std;
class Animal{
public:
void getFamily(){ cout << "We are animals " << endl;}
virtual void getClass() { cout << "I'm an animal" << endl; }
};
class Dog : public Animal{
public:
virtual void getClass(){ cout << "I'm a dog" << endl; }
};
void whatClassAreYou(Animal *animal){
animal -> getClass();
}
int main(){
Animal *animal = new Animal;
Dog *dog = new Dog;
animal->getClass(); // I'm an animal
dog->getClass(); // I'm a dog
Animal *animal1 = new Dog;
animal1->getClass(); // I'm a dog
whatClassAreYou(animal1); // I'm a dog
whatClassAreYou(animal); // I'm an animal
return 0;
}
答案 2 :(得分:0)
§C.1.6更改:在C ++中禁止隐式int
decl-specifier-seq
必须包含type-specifier
,除非后跟一个声明符 构造函数,析构函数或转换函数。
您错过了type-specifier
,这在现代C ++中是非法的。
使用:
void getClass(){ cout << "I'm a dog" << endl; }