J'essaie de comprendre plusieurs héritages, voici mon code:
struct A { A() {} static int n; static int increment() { return ++n; } }; int A::n = 0; struct B : public A {}; struct C : public A {}; struct D : public B, C {}; int main() { D d; cout<<d.increment()<<endl; cout<<d.increment()<<endl; }
3 Réponses :
Héritage de diamant: http://www.parashift.com/c++-faq /midiamond.html Fonctions de masquage: http://www.parashift.com/c++-faq/ cache-hérité-hérité-public.html p>
qu'est-ce que la moyenne ambiguë? em> p>
Un compilateur se plaint d'appels ambigus lorsqu'il ne peut pas décider quelle fonction d'appel compte tenu du contexte. Ainsi, pour comprendre les plaintes, vous devez vérifier quelles pourraient être les ambiguïtés. P>
Pourquoi le compilateur se plaint de l'appel ambigu de la version non statique de l'incrément (), tout en satisfaisant avec le statique? P>
blockQuote>
Par définition, un Le problème de l'héritage de diamant n'est pas que le compilateur ne sait pas quel code em> exécuter, c'est que cela ne sait pas quel Lorsque vous utilisez une fonction Si j'ajoute une autre fonction d'incrément () à B ou C, le compilateur se plaindre également, même déclaré comme statique. Pourquoi? P>
blockQuote>
À ce stade, le compilateur peut choisir entre Lorsque vous avez une hiérarchie linéaire, il appelle le "plus proche" à celui-ci (qui cache ces personnes plus loin dans l'arbre d'héritage), mais ici Remarque: même si
Static code> La fonction d'une classe ne dépend pas d'une instance de la classe. Cela est souligné par le fait que vous pouvez appeler cela
A :: incrément () code> (voir, aucune instance). P>
ce code> à fournir (il y a deux
A code> dans votre objet
d code> objet, un contenu dans
B code> et un dans
c code>). p>
statique code> de
A code>, aucun
implicite code> est passé, il n'y a donc pas de problème; Si vous essayez d'utiliser une fonction STATIC code> statique code>, le compilateur ne peut pas décider si
ceci code> doit pointer sur le
A code> dans
b < / code> ou dans
C code>, il est ambigu. p>
B :: incrément () code> et
c :: incrément () code>, lequel devrait-il choisir? C'est ambigu. P>
b code> et
c code> sont deux branches indépendantes et il n'y a pas de «meilleure» branche. P>
B code> ne met pas en œuvre
incrément code>, puisque code> A code> pouvez-vous appeler
b :: incrément () code> qui appelle réellement
A :: incrément () code>. Il en va de même pour
C code>. Em> p>
Cette instruction:
struct D : public B, C {};
Remarque: Utiliser sur Ideone