La advertencia está señalando que si cualquier operación de clase weak
vbc
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
.
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
@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
@MSalters ¡Te sugiero que lo leas de nuevo! class2 es la clase BASE. – CinCout