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