Les méthodes virtuelles pures dans dérivée de la classe abstraite
Dire que nous avons ceci:
class A
{
public:
virtual void foo() = 0;
};
class B: public A
{
public:
virtual void foo() = 0;
};
Le compilateur renvoie pas d'erreur, je suppose que c'est parce que B est aussi une classe abstraite et en tant que tel, il n'a pas à mettre en œuvre foo
d'A.
Mais en quoi une telle construction signifie?
1) Ne foo
de B cacher foo
?
2) La première classe qui hérite de B et n'est pas une classe abstraite, il faut fournir deux implémentations comme:
class C: public B
{
public:
virtual void A::foo() {};
virtual void B::foo() {};
};
Le compilateur ne se plaint si la mise en œuvre de B::foo()
est manquant, mais il n'a pas à se plaindre d'un manque A::foo()
.
Dans l'ensemble: est-ce une façon de masquer les méthodes virtuelles pures?
Exactement comment avez-vous cacher?
Si je n'ai pas de fournir une implémentation pour A::foo() en C, je peux aussi instancier un objet de C. Donc C peut toujours être instancié, même lorsque A::foo() est manquant. Alors j'ai pensé que quelque part A::foo() n'est pas nécessaire dans C, donc "caché".
Parce que B hérite d'Une..
Si je n'ai pas de fournir une implémentation pour A::foo() en C, je peux aussi instancier un objet de C. Donc C peut toujours être instancié, même lorsque A::foo() est manquant. Alors j'ai pensé que quelque part A::foo() n'est pas nécessaire dans C, donc "caché".
Parce que B hérite d'Une..
OriginalL'auteur Juergen | 2013-03-24
Vous devez vous connecter pour publier un commentaire.
Lorsque vous déclarez d'abord:
de déclarer la méthode
foo
public, virtuel et pure. Si une classe contient au moins une méthode pure il est appelé résumé. Ça veut dire quoi? Cela signifie que la classe ne peut pas être instanciée, car il a besoin de la pure implémentations des méthodes.Vous pouvez évidemment hériter d'une classe abstraite (je dirais que vous êtes obligé de le faire, sinon ce serait la nécessité d'une classe abstraite vous ne l'utilisez pas, sauf pour la fourniture d'une interface d'hériter?) et vous pouvez également hériter d'une classe abstraite et ne pas mettre en œuvre certaines ou de la totalité de la pure méthodes de la classe parent; dans ce cas, l'enfant de la classe est abstraite, ce qui est le cas de la classe B:
Dans B, on pourrait facilement omettre le
virtual void foo() = 0;
déclaration, parce que la définition est déjà hérité de la classe de base. Dans ce cas, la classe B est une classe abstraite et, par conséquent, ne peut pas être instanciée, tout comme A.Pour répondre à vos questions plus directement:
Non, il n'est pas. Ils sont tous les deux de la déclaration d'une méthode pure (qui est en fait la même méthode), donc il n'y a rien de vraiment cacher.
Non, bien sûr que non. Comme indiqué ci-dessus, ils sont de la même méthode, donc si la classe C doivent fournir une implémentation pour
foo
il faut juste mettre en œuvrefoo
:Virtual
vraiment nécessaire dans la classe C. il ne Peut pas être justevoid foo() {};
?Selon la norme C++, non, il n'est pas nécessaire. Je trouve ça plus lisible.
OriginalL'auteur Shoe
Il lèvera une erreur lorsque vous essayez d'instancier un objet à partir de
A
ouB
qui ils sont abstraits. Pas lorsque vous êtes en hériter et de déclarer leur.Pas. Il overtides
A::foo
pas le masque.Pas. Juste remplacer
foo
et d'en faire une application pour cela.Si vous souhaitez obtenir un objet de
C
ensuite, il doit mettre en œuvrefoo
Non,
B::foo
n'est pas le même queA::foo
, et ne cacher (comme remplaçant).OriginalL'auteur deepmax
J'ai compilé ton code avec gcc 4.5.3, il a donné des messages d'erreur suivants:
En vous exemple, à la fois classe
A
etB
sont des classes abstraites depuis foo est virtuelle pure. Ils ne définissent que la classe dérivée de B doit mettre en œuvre le comportement defoo
puisqu'il n'est pas le comportement par défaut à utiliser (si la classe dérivée n'est pas abstrait plus).Question 1:Does foo from B hide foo from A?
Depuis
foo
dansB
etA
a exactement le même nom, la même signature et foo est virtuelle dans la classe de base, de sorte qu'il n'est pas cacher, c'est primordial. Pour info: UNE classe dérivée de la fonctionoverrides
une classe de base de la fonction si la signature est la même et elle est déclarée virtuelle dans la classe de base. Si vous l'appelezpar le biais d'un pointeur ou d'une référence à la classe de base, la fonction dans le
la classe dérivée est appelée. Il "remplace" l'un dans la classe de base.
Hiding
n'intervient que si vous appelez une fonction non virtuelle par le biais d'unpointeur ou une référence ou directement avec un objet de la classe dérivée. Un
classe dérivée de la fonction de cache tous de la classe de base des fonctions avec le même nom.
Question 2: The first class which inherits from B and is not an abstract class, does it have to provide two implementations
Pas. Vous pouvez effectuer les opérations suivantes:
Merci pour la confirmation.
OriginalL'auteur taocp