C++ des fonctions virtuelles de la mise en œuvre à l'extérieur de la classe
Je suis novice en C++. Tout en essayant exemple de polymorphisme de code, j'ai trouvé que la classe de base virtuelle définition de la fonction dans la classe dérivée n'est possible que lorsqu'il est défini dans la classe dérivée ou à l'extérieur avec de la déclaration dans la classe dérivée.
Code suivant donne une erreur:
class B
{
public:
virtual void f();
};
void B::f() {
std::cout<<"B::f";
}
class D : public B
{
public:
void f2() {int b;}
};
//error: no "void D::f()" member function declared in class "D"
void D::f() {
std::cout<<"D::F";
}
Il fonctionne si je déclare f() à l'intérieur de D. je me demandais pourquoi dois-je déclarer explicitement la fonction de nouveau quand il est déjà déclarée dans la classe de Base. Le compilateur peut obtenir la signature de la classe de Base droit?
Merci d'avance..
vous avez fait f() dans une fonction virtuelle dans la classe de base, donc il est abstrait et doivent être mises en œuvre dans votre D de la classe. Vous pouvez en lire plus à propos de fonction virtuelle ici parashift.com/c++-faq-lite/virtual-fonctions.html#faq-20.1
non, il n'est pas vrai, si c'était abstract =0 suivre la déclaration de la méthode.
est le bon mot. une fonction virtuelle peut ou ne peut pas être pur. aussi, "abstrait", décrit la classe, pas la fonction virtuelle. et B ne pas déclarer une fonction virtuelle pure.
Je suppose que B::f() n'est pas abstraite, sa définition de B existe. Est-il besoin d'être défini en ligne dans le B pour s'assurer de son caractère concret?
non, il n'est pas vrai, si c'était abstract =0 suivre la déclaration de la méthode.
est le bon mot. une fonction virtuelle peut ou ne peut pas être pur. aussi, "abstrait", décrit la classe, pas la fonction virtuelle. et B ne pas déclarer une fonction virtuelle pure.
Je suppose que B::f() n'est pas abstraite, sa définition de B existe. Est-il besoin d'être défini en ligne dans le B pour s'assurer de son caractère concret?
"I was wondering why do I need to explicitly declare the function again"
. Ce sont les règles du jeu c++
.
OriginalL'auteur Manish | 2010-12-21
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas ajouter des membres à une classe en dehors de la définition de la classe. Si vous voulez
D
avoir un remplacement pourB::f
ensuite, vous devez le déclarer à l'intérieur de la définition de la classe. Ce sont les règles.Déclaration d'un membre dans une classe de base n'est pas automatiquement les classes dérivées identique d'un membre. Héritant de la base de donne de la classe dérivée de tous les membres de la classe de base de sorte que vous pouvez choisir de les ignorer, de les masquer ou de les ajouter à la base des classes de membres, mais vous devez indiquer un choix de remplacer dans la définition de la classe en déclarant la fonction dominante.
f()
dans la classeD
,B::f()
est accessible (c'est à dire, peut être appelé enD
) sans aucun problème. C'est seulement lorsque vous voulez remplacer, vous devez redéfinir dansD
.Merci à tous. Je suppose que c'est juste la façon dont le langage et le compilateur est conçu. Je viens de penser logiquement que si le compilateur peut obtenir la signature de la classe de base, pourquoi ne peut-il pas assumer automatiquement c'est substituée à la mise en œuvre en raison même de la signature.
OriginalL'auteur CB Bailey
Même si D dérive de B et, par conséquent, vous pouvez appeler f() sur une instance de D, il ne signifie pas que vous n'avez pas besoin de mettre de la déclaration dans l'en-tête.
Toute fonction que vous mettre en œuvre doit être explicitement déclaré dans l'en-tête.
Vous n'avez pas besoin, cependant, de mettre à sa mise en œuvre. Juste
et vous pouvez également choisir d'inclure le mot "virtuel" ici
OriginalL'auteur CashCow
En C++, votre définition de la classe indique au compilateur qui fonctionne de la classe implémente. Donc, si vous voulez écrire une fonction "D::f()", vous devez avoir f() dans la définition de classe pour D.
Le fait que la fonction "B::f()" a été défini dans la classe de base n'est pas pertinent. Chaque définition de classe doit déclarer explicitement les fonctions qu'elle met en œuvre.
OriginalL'auteur richb