Переопределение "виртуальной пустоты" 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; }
Другие вопросы по тегам