Лично я сомневаюсь, что такого рода автоматическое устранение неоднозначности возможно в C ++ на уровне языка.
В каждом конкретном случае возможно устранение неоднозначности путем явного указания класса, метод которого должен быть выполнен,вот так:
QGLWidget::ambiguous_method(...
Это не то, о чем вы просите, я знаю, и я уверен, что вы уже знаете об этом.Я говорю просто для полноты.
С другой стороны, я не уверен, что этот вид устранения неоднозначности был бы желателен или просто полезен, потому что основной момент, при котором множественное наследование является «деликатным», - это репликация данных.внутри производного класса.Если бы у вас была автоматическая устранение неоднозначности, вы бы в конечном итоге использовали (когда нет неоднозначности) частичный объект, соответствующий базовому классу, а в других случаях частичный объект, соответствующий другому базовому классу (из-за автоматической неоднозначности), и вы быполучить мозаику вещей, которые не имели бы никакого смысла, например, поврежденный объект ...
Наконец, я думаю, что этот вид автоматического устранения неоднозначности был бы невозможен, если бы у вас были более сложные диаграммы наследования, например, следующиеваш пример:
class Nasty : QGLWidget {};
class Very_nasty : Nasty, MyClass2 {};
Не было бы возможности автоматического устранения неоднозначности.Действительно, предположим, что предоставленные вами классы образуют библиотеку и что вы решили при создании библиотеки использовать MyClass2::QGLWidget
в качестве основы для устранения неоднозначности.
Теперь я беру вашу библиотеку и определяю еще два класса, напримерте, которые я дал.Very_nasty
наследует QGLWidget
от Nasty
и от Class2
;у каждого есть QGWidget
внутри, и в целом у меня есть 3 из них (потому что Class2 уже унаследовал его дважды).
Теперь предположим, что для меня базовый класс для устранения неоднозначности должен быть Very_Nasty::Nasty::QGLWidget
, учитываясемантика моего класса.Если вы скажете, что автоматическое устранение неоднозначности является способом разрешения неоднозначностей с множественным наследованием, я смогу указать его для каждого случая множественного наследования.
Что произойдет, если я вызову через Very_nasty
метод, унаследованный отMyClass2?
Что произойдет, если я вызову через Very_nasty
метод, унаследованный от Nasty?
Они выберут два разных пути устранения неоднозначности.Clash.