Avertissement C4250 du compilateur Visual Studio (‘class1’: hérite de ‘class2 :: member’ via dominance)

Le code suivant génère l’avertissement C4250. Ma question est la suivante: quelle est la meilleure solution?

class A { virtual void func1(); } class B : public A { } class C : public A { virtual void func1(); } class D : public B, public C { } int main() { D d; d.func1(); // Causes warning } 

D’après ce que j’ai lu, il devrait être possible de faire ceci:

 class D : public B, public C { using B::func1(); } 

Mais cela ne fait réellement rien. La façon dont j’ai résolu le problème est la suivante:

 class D : public B, public C { virtual void func1() { B::func1(); } } 

Quel est l’avis de tout le monde à ce sujet?

    J’ai eu le même avertissement pour le code suivant:

     class Interface { public: virtual void A() = 0; }; class Implementation : public virtual Interface { public: virtual void A() {}; }; class ExtendedInterface : public virtual Interface { virtual void B() = 0; }; class ExtendedImplementation : public ExtendedInterface , public Implementation { public: virtual void B() {}; }; 

    Ce rapport de bogue pour Visual C ++ 2005 dans msdn suggère qu’il s’agit d’un bogue connu qui n’a pas été jugé suffisamment important pour être corrigé … Ils suggèrent de désactiver l’avertissement dans ce cas en utilisant un pragma. Je pense que c’est également sûr dans votre cas, mais vous devriez utiliser l’inheritance virtuel, comme indiqué dans la réponse de Gal Goldman.

    Avez-vous essayé d’hériter du virtuel public de la classe A? Je pense que cela devrait le résoudre.

     class B :public virtual A; class C :public virtual A; class D : public virtual B, public virtual C; 

    L’inheritance virtuel suppose de résoudre l’ambiguïté.

    [Un commentaire vraiment, mais je n’ai pas assez de rep …]

    David Segonds a identifié ceci comme un bogue connu dans VS 2005, il vient d’essayer son exemple de code dans VS 2008 et présente le même problème.

    Je pense que la solution que vous utilisez peut être la solution, désolé de le dire. La seule chose que je peux penser à cela pourrait aider, c’est si vous êtes capable de rendre la fonction de A pure virtuelle. Cela pourrait ne pas être réalisable dans votre programme réel, cependant.

    Facile à résoudre

     class A { virtual void func1(); } class B : public A { } class C : public A { virtual void func1(); } class D : public B, public C { virtual void func1() { C::func1(); } } int main() { D d; d.func1(); // Causes warning }