Переопределение "виртуальной пустоты" C++ ошибка
Следующий код дает мне ошибку.
Ошибка: переопределение 'virtual void Animal::getClass()', где говорится, что virtual void getClass() { cout << "I'm a animal" << endl; }
Ошибка: конфликтует возвращаемый тип, указанный для 'virtual int Dog::getClass()', где он говорит getClass(){ cout << "I'm a dog" << endl; }
Также написано:
Класс "Собака" имеет виртуальный метод "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 ответа
Измените определение внутри класса Dog на:
void getClass() { /* ... */ }
Когда вы объявляете его без возвращаемого типа, компилятор устанавливает тип возвращаемого значения как int. Это приводит к ошибке, потому что переопределенный метод должен иметь тот же тип возврата, что и метод базового класса, который он переопределяет.
Вы пытаетесь объявить функцию без возвращаемого типа, который был разрешен в более старой версии C++. Но стандарт ISO C++ не допускает этого (хотя некоторые компиляторы все еще могут разрешать, я полагаю, как Codegear C++Builder 2007, который вообще не показывает ошибок или предупреждений). Это было упомянуто в стандарте - сноска 78 §7/7 и сноска 80 §7.1.5/2: неявный int запрещен.
Вот причина, почему это было отброшено:
void HypotheticalFunction(const Type);
В этой функции, что будет тип аргумента - const аргумент типа Type или аргумент типа const 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;
}
§ C.1.6 Изменение: запрет неявного int в C++
decl-specifier-seq
должен содержатьtype-specifier
, если за ним не следует декларатор для конструктора, деструктора или функции преобразования.
Вы скучаете по type-specifier
что недопустимо в современном C++.
Использование:
void getClass(){ cout << "I'm a dog" << endl; }