Pourquoi est hérité de membre n'est pas autorisé?
Je suis débutant en C++ et je suis en train de faire un des exercices abstraites de la classe et d'héritage.
C'est ma classe abstraite:
#ifndef SHAPE_H
#define SHAPE_H
class Shape
{
public:
virtual void area();
virtual void perimeter();
virtual void volume();
};
#endif
C'est ma classe qui implémente la classe abstraite:
#include <iostream>
#include <cmath>
#include "Shape.h"
using namespace std;
class Circle : public Shape
{
public:
Circle(int);
private:
int r;
};
Circle::Circle(int rad)
{
r = rad;
}
void Circle::area()
{
cout << "Area of this cirle = " << 3.14 * pow(r, 2) << endl;
}
void Circle::perimeter()
{
cout << "Perimeter of this cirle = " << 2 * 3.14 * r << endl;
}
void Circle::volume()
{
cout << "Volume is not defined for circle." << endl;
}
J'ai eu des lignes rouges sous area()
, perimeter()
, et volume()
dans mon Circle
classe, qui a montré "Error: inherited member is not allowed"
. Je suis allé dans ma classe ppt et googlé pour la réponse, mais pas de chance. Toute aide est appréciée.
- vous devez toujours déclarer les méthodes virtuelles dans une classe dérivée.
Shape
n'a pas l'air de l'abstrait. Ses fonctions de membre doit être pur virtuel pour que. En outre, il doit déclarer un destructeur virtuel.- N'oubliez pas de déclarer
virtual ~Shape() {}
- Voulez juste de corriger la terminologie utilisée dans la question. En résumé, vous dire un fichier d'en-tête, et par le béton-vous vraiment dire votre fichier de définition. Pas sûr si ce que vous avez été à la recherche de méthodes virtuelles pures.
Vous devez vous connecter pour publier un commentaire.
Vous devez déclarer le plus en proie à des fonctions dans le cadre de la définition de votre classe
Noter que l'utilisation de
virtual
ici est facultatif.N.m. a noté, vous devez également inclure un destructeur virtuel dans
Shape
. Vous pouvez également faire de ses fonctions virtuelles virtuelle pure (en fonction de votre commentaire à propos deShape
abstrait)override
dansCircle
est probablement une bonne idée.override
mot-clé? Je ne suis au courant de la extension Microsoft mais vous devez savoir que le code est nécessaire pour compiler avec les versions récentes de MSVC pour l'utiliser.vous devez déclarer le remplacement des méthodes de trop dans le Cercle de la classe
D'abord, vous devez vous rendre Forme de classe explicitement résumé:
De cette façon, vous n'avez pas à définir que les méthodes de la classe Forme, et ce qui est plus important si vous oubliez de remplacer l'un de la méthode abstraite dans la classe dérivée et serait d'essayer de créer une instance, le compilateur va vous rappeler.
Deuxième lorsque vous remplacez méthode virtuelle dans la classe dérivée, vous devez les déclarer: