2016-01-15 3 views
0

Следующий код дает мне ошибку.overriding «virtual void» C++ error

Error: overriding 'virtual void Animal::getClass()', where it says virtual void getClass() { cout << "I'm an animal" << endl; }

Error: conflicting return type specified for 'virtual int Dog::getClass()', where it says getClass(){ cout << "I'm a dog" << endl; }

Кроме того, он говорит:

Class 'Dog' has virtual method 'getClass' but non-virtual destructor

#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; 
} 
+1

Что касается виртуального деструктора см: [Когда использовать виртуальные деструкторы?] (Http://stackoverflow.com/a/461237), так как ваш класс имеет виртуальную функцию, как надо также имеют виртуальный деструктор. –

+1

Вы должны добавить виртуальный деструктор, если вы разрушите свой класс в полиморфном контексте. Если это определение еще не звонит с вами, просто добавьте его. Обратите внимание, что в примере @SalahSalah вообще нет деструкторного вызова. – dascandy

ответ

3

Изменить определение внутри класса Dog на:

void getClass() { /* ... */ } 

Когда вы объявляете его без возвращаемого типа, компилятор устанавливает return type to int. Это приводит к ошибке, потому что метод overriden должен иметь тот же тип возврата, что и метод базового класса, который он переопределяет.

+2

По умолчанию тип возврата 'int' даже не поддерживается стандартом C++ (он устарел в C) и должен давать предупреждение/ошибку о том, что отсутствует (возвращаемый) тип во всех современных компиляторах. –

1

Вы пытаетесь объявить функцию без возвращаемого типа, которая была разрешена в старой версии C++. Но стандарт ISO C++ не позволяет этого (хотя некоторые компиляторы все еще позволяют, я думаю, что Codegear C++ Builder 2007, который вообще не обнаруживает ошибок или предупреждений). Он упоминается в стандарте - §7/​​7 сноска 78 и §7.1.5/2 сноска 80: неявный int запрещен.

Вот причина, почему он был отброшен:

void HypotheticalFunction(const Type); 

В этой функции, что бы аргумент типа - сопзЬ аргумент типа типа или аргумент типа сопзЬ Int с типом имени ?

Вот лучший вариант, как вы могли бы определить свой класс:

#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; 
} 
0

§ C.1.6 Change: Banning implicit int In C++
a decl-specifier-seq must contain a type-specifier , unless it is followed by a declarator for a constructor, a destructor, or a conversion function.

вам не хватает своего type-specifier, который является незаконным в современном C++.

Использование:

void getClass(){ cout << "I'm a dog" << endl; }