Неопределенности полиморфизма, можем ли мы разрешить их с использованием базы по умолчанию - PullRequest
0 голосов
/ 26 мая 2011

Мне нужен слой абстракции, включающий QWidget, который может быть QGLWidget, и мне интересно, есть ли способ сказать компилятору: «Каждый раз, когда у вас есть сомнения (неоднозначности), попробуйте использовать базу по умолчаниюЯ даю вам ", конечно, если есть неясности, которые он не может разрешить с выбором по умолчанию, он выдает ошибки, как это происходит.Моя цель не состоит в том, чтобы однозначно решать каждую из неоднозначностей, поскольку я всегда буду перенаправлять их в один и тот же класс.

Быстрая настройка,

#Qt inheritance (very roughly...)
class QWidget {}; 
class QGLWidget : public QWidget {}; 

#my side
class MyAbstract : public QWidget {}; //used by a factory
class MyClass1 : public MyAbstract {}; 
class MyClass2 : public MyAbstract, public QGLWidget{};

Я осведомленный компиляторне может самостоятельно определить дубликаты методов для использования в классе MyClass2, так как QGLwidget наследует и повторно реализует большую часть QWidget, но я могу сказать компилятору сначала использовать QGLWidget, так какЯ знаю, это то, что я хочу?

Qt - только пример здесь.

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Хороший ответ: не моделируйте ничего как наследование, пока это не станет абсолютно необходимым.

Точный ответ: используйте виртуальный базовый класс.

0 голосов
/ 26 мая 2011

Лично я сомневаюсь, что такого рода автоматическое устранение неоднозначности возможно в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...