覆盖'virtual void'c ++错误

时间:2016-01-15 02:31:30

标签: c++ virtual-method

以下代码给出了错误。

  

错误:覆盖'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;
}

3 个答案:

答案 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; }