В предупреждении указывается, что если какие-либо операции класса weak
зависят от vbc
виртуальных операций, которые реализованы в dominant
, то эти операции могут изменить поведение из-за того, что они связаны в иерархии наследования алмазов .
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
}
Это поведение, которое определяет стандарт, но иногда для программиста может показаться удивительным, что поведение операции weak::print
изменилось не из-за переопределенного метода выше или ниже в иерархии, а из-за родственного класса в иерархия наследования при вызове из derived
. Обратите внимание, что это имеет смысл с точки зрения derived
, это вызов операции, которая зависит от виртуального метода, реализованного в dominant
.