c++ visual-studio-2008 warnings multiple-inheritance

c++ - Visual Studio Compiler advierte C4250(''class1'': hereda ''class2:: member'' mediante dominancia)



visual-studio-2008 warnings (5)

¿Intentó heredar público virtual de la clase A? Creo que debería resolverlo.

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

La herencia virtual supone resolver la ambigüedad.

El siguiente código genera una advertencia C4250. Mi pregunta es, ¿cuál es la mejor solución?

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 }

De acuerdo con lo que he leído, debería ser posible hacer esto:

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

Pero, esto en realidad no hace nada. La forma en que lo resolví actualmente es:

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

¿Cuál es la opinión de todos sobre esto?


Creo que la solución que está utilizando puede ser el camino a seguir, lamento decirlo. Lo único que puedo pensar que podría ayudar es si puedes hacer que A func1 sea puramente virtual. Sin embargo, eso podría no ser factible en tu programa real.


Tuve la misma advertencia para el siguiente código:

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

Este informe de error para Visual C ++ 2005 en msdn sugiere que se trata de un error conocido que no se consideró lo suficientemente importante como para solucionarlo ... Sugieren desactivar la advertencia en este caso utilizando un pragma. Creo que también es seguro en tu caso, pero debes usar la herencia virtual como se muestra en la respuesta de Gal Goldman.


Fácil resolver

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 }


[Un comentario realmente, pero no tengo suficientes representantes ...]

David Segonds identificó esto como un error conocido en VS 2005, acaba de probar su código de ejemplo en VS 2008 y muestra el mismo problema.