Что неоднозначное значит?
Компилятор жалуется на неоднозначные вызовы, когда не может решить, какую функцию вызывать с учетом контекста. Итак, чтобы понять жалобы, вы должны проверить, какие могут быть возможные двусмысленности.
Почему компилятор жалуется на неоднозначный вызов нестатической версии increment(), но удовлетворяет статическому?
По определению функция класса static
не зависит от какого-либо экземпляра класса. Это подчеркивается тем фактом, что вы могли бы назвать его A::increment()
(см., Нет примера).
Проблема алмаза наследования не то, что компилятор не знает, какой код выполнить, то, что это не знает, какие this
обеспечить (есть два A
в вашем D
объекта, один содержащийся в B
и один в C
).
Если вы используете функцию static
A
, не пропускается неявный this
, поэтому проблем нет; если вы попытаетесь использовать функцию не static
, тогда компилятор не может решить, должно ли this
указывать на A
в B
или в C
, это неоднозначно.
Если я добавлю другую функцию increment() в B или C, компилятор также будет жаловаться, даже объявлен как статический. Зачем?
На данный момент, компилятор может выбрать между B::increment()
и C::increment()
, что он должен выбрать?Это неоднозначно.
Если у вас есть линейная иерархия, она называет «ближе» к нему (который скрывает тот, далее вниз по дереву наследования), но здесь B
и C
две независимых ветви, и нет «лучше» филиала.
Примечание: даже если B
не реализует increment
, поскольку A
делает вы можете вызвать B::increment()
, который на самом деле вызывает A::increment()
. То же самое касается C
.
Примечание: [работает на идеоне] (http://ideone.com/4Hollz) –