Die Warnung wird darauf hingewiesen, dass, wenn irgendwelche weak
Klassen Operationen auf vbc
virtuelle Operationen abhängen, die in dominant
umgesetzt werden, dann könnten diese Vorgänge Verhalten aufgrund der Tatsache ändern, dass sie in einer Diamant-Vererbungshierarchie gebündelt werden.
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
}
dass das Verhalten ist, dass die Norm spezifiziert, aber es könnte für den Programmierer zu Zeiten, die weak::print
Betriebsverhalten geändert haben aufgrund einer überschriebenen Methode oben oder unten in der Hierarchie, sondern von einem Geschwister überraschend Klasse in der Vererbungshierarchie, wenn sie von derived
aufgerufen wird. Beachten Sie, dass es vom Standpunkt der derived
Sicht sinnvoll ist, dass es eine Operation aufruft, die von einer virtuellen Methode abhängt, die in dominant
implementiert ist.
Die Erklärung in dem MSDN-Artikel widerspricht sich."Der in Klasse 2 wird geerbt, weil er eine Basisklasse ist" - aber Klasse2 ist die abgeleitete Klasse, nicht die Basisklasse in ihrem Beispiel. – MSalters
@MSalters: Ich kann den Widerspruch nicht sehen. Sie verwenden 'class2' nicht in ihren Beispielen. Tatsächlich geben sie in ihren ausgearbeiteten Beispielen niemals ein Beispiel für den Text der Warnung. – quamrana
@MSalters Ich empfehle Ihnen, es erneut zu lesen! class2 ist die BASE-Klasse. – CinCout