2010-02-03 9 views
9

¿Qué significa C4250 advertencia de Visual C + en términos prácticos? He leído la página MSDN vinculada, pero todavía no entiendo cuál es el problema.¿Qué significa la advertencia C4250 VC++?

¿De qué me advierte el compilador y qué problemas podrían surgir si ignoro la advertencia?

+1

La explicación en el artículo de MSDN se contradice a sí misma."El de la clase 2 se hereda porque es una clase base", pero la clase 2 es la clase derivada, no la clase base en su ejemplo. – MSalters

+0

@MSalters: No puedo ver la contradicción. No usan 'class2' en sus ejemplos. De hecho, nunca dan un ejemplo del texto de la advertencia en sus ejemplos trabajados. – quamrana

+0

@MSalters ¡Te sugiero que lo leas de nuevo! class2 es la clase BASE. – CinCout

Respuesta

20

La advertencia está señalando que si cualquier operación de clase weakvbc dependen de las operaciones virtuales que se implementan en dominant, entonces esas operaciones podrían cambiar el comportamiento debido al hecho de que están agrupados en una jerarquía de herencia de diamante.

struct base { 
    virtual int number() { return 0; } 
}; 
struct weak : public virtual base { 
    void print() { // seems to only depend on base, but depends on dominant 
     std::cout << number() << std::endl; 
    } 
}; 
struct dominant : public virtual base { 
    int number() { return 5; } 
}; 
struct derived : public weak, public dominant {} 

int main() { 
    weak w; w.print(); // 0 
    derived d; d.print(); // 5 
} 

Ese es el comportamiento que los previsto por la norma, pero podría ser sorprendente para el programador, a veces, el comportamiento weak::print operación ha cambiado no a causa de un método reemplazado por encima o por debajo en la jerarquía, sino por un hermano clase en la jerarquía de herencia, cuando se llama desde derived. Tenga en cuenta que tiene perfecto sentido desde el punto de vista derived, que está llamando a una operación que depende de un método virtual implementado en dominant.

+1

Bueno, lo que no entiendo: ¿Cómo se determina qué clase es dominante? ¿Por orden de la lista de clases heredadas? – flohack

+0

@flohack: no estoy seguro de que * dominante * frente a * débil * sea la terminología correcta o si confunde más que ayuda ... Si piensa en un gráfico de herencia, donde los nodos son tipos y flechas que son relaciones de herencia, en el objeto final habrá múltiples caminos desde las bases hasta el * uno * objeto completo. En cada ruta habrá * un * overrider final para cada función virtual en las bases, en uno de los tipos, el más cercano al objeto * complete *. –

+1

... se puede pensar en la herencia virtual como ramas en el gráfico, si el overrider final para una de las ramas está por encima del punto de división, y la otra rama proporciona una overrider posterior, reemplaza la overrider para ambas ramas. En el nivel del objeto * complete * (el tipo real construido), el overrider final en todas las rutas debe referirse al mismo tipo, si no lo hace, entonces se obtiene un error en el momento de la compilación. –

14

Significa que el compilador ha notado que está utilizando una característica menos conocida de herencia virtual para la que tiene un nombre. No tengo idea de por qué pensaron que era una buena idea hacer una advertencia, pero no tiene importancia práctica; el código debería funcionar como lo especifica el lenguaje, no señala una deficiencia del compilador ni nada.

+0

No es broma, y ​​para hacerlo aún más misterioso, ¿por qué es una advertencia de nivel 2 y no un nivel 4 (como "variable local sin referencia" o "variable inicializada pero nunca utilizada")? – davidbak

2

En el linked ejemplo, usted tiene diamond que hereda tanto weak y dominant, uno de ellos heredando prácticamente desde vbc, pero sólo dominant anulaciones func()

hay un problema en C++ cuando se tiene una estructura de este tipo cuando Don 't usa herencia virtual. Sin embargo, con herencia virtual, el problema se resuelve, por lo que la alerta es sólo información que le dice que si:

  1. Usted no había utilizado la herencia virtual, O
  2. weak habían aplicado func()

entonces obtendrías un error de compilación.

Por lo tanto, mi opinión es que si sabe lo que está haciendo puede deshabilitar esta advertencia de forma segura para la totalidad de su proyecto.

2

En VS2012 puede obtener esta advertencia para "nada", excepto para heredar una clase de iostream. La retroalimentación MS article indica que esta advertencia se puede ignorar en este caso.

Si no desea suprimir este tipo de advertencias pero quiere un código multiplataforma que no produzca esta advertencia de basura en vs2012, un article on C4250 sugiere en CodeInPro que agregue estas líneas "no hacer nada" a su código en la clase que heredó de un iostream:

void _Add_vtordisp1() { } // Required to avoid VC++ warning C4250 
void _Add_vtordisp2() { } // Required to avoid VC++ warning C4250 
Cuestiones relacionadas