2009-01-22 10 views
10

Le code suivant génère l'avertissement C4250. Ma question est la suivante: quelle est la meilleure solution?Avertissement du compilateur Visual Studio C4250 ('class1': hérite 'class2 :: member' via la dominance)

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 je l'ai lu, il devrait être possible de le faire:

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

Mais, cela ne fait quoi que ce soit. La façon dont je l'ai actuellement résolu est la suivante:

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

Qu'est-ce que tout le monde voit à ce sujet?

+0

Le code dans le premier bloc ne compile pas et après l'avoir modifié pour compiler il ne génère pas C4250. – quamrana

Répondre

7

Avez-vous essayé d'hériter de la classe virtuelle publique de la classe A? Je pense que ça devrait le résoudre.


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

L'héritage virtuel suppose de résoudre l'ambiguïté.

+1

Oui, même avec l'héritage virtuel, il y a toujours le même problème (il y a deux fonctions appropriées à appeler, le compilateur choisit simplement le plus "surchargé") –

+0

Ensuite, je suppose qu'il n'y a pas d'échappatoire à votre solution suggérée. –

+3

J'ai compilé votre code maintenant dans VS2005 et sans le virtuel c'est en fait une erreur, pas un avertissement. Avec le virtuel, c'est un avertissement. –

0

Je pense que la solution que vous utilisez peut être la solution, désolé de le dire. La seule chose à laquelle je peux penser est que si vous êtes capable de rendre la fonctionnalité de A pure1 virtuelle. Ce n'est peut-être pas faisable dans votre vrai programme.

+1

Malheureusement, il y a un bug dans Visual Studio qui signifie que l'avertissement apparaîtra toujours;) –

18

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() {}; 
}; 

Cette bug report pour Visual C++ 2005 msdn suggère que c'est un bug connu qui n'a pas été jugé assez important de fixer ... Ils suggèrent de désactiver l'avertissement dans ce cas en utilisant un pragma. Je pense que c'est sûr aussi dans votre cas, mais vous devriez utiliser l'héritage virtuel comme indiqué dans la réponse de Gal Goldman.

0

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 
} 
1

[Un commentaire vraiment, mais je n'ai pas assez rep ...]

David Segonds a identifié cela comme un bug connu dans VS 2005, juste essayé son exemple code dans VS 2008 et il présente le même problème.

Questions connexes