2011-07-28 3 views
32

Я пытаюсь реализовать довольно большой объект, который реализует множество интерфейсов. Некоторые из этих интерфейсов являются чисто виртуальными. У меня может возникнуть проблема в наследовании алмазов. Visual Studio сообщает о предупреждении C4250 ('class1' : inherits 'class2::member' via dominance). Прежде всего эти классы наследуются практически так, как должно быть. Ниже приведена конструкция частичного класса, которая вызывает эту проблему.C++ Наследование через предупреждение о доминировании

A  B  C 
\ /\ /
    \ / \ /
    AB  BC 
    |   | 
    |  BC2 
    |   | 
    \  D: Implementation of B, C, BC, BC2 
     \ /
     Big 

Во всем этом дереве только D реализует виртуальные методы, нет другого определения рассматриваемого метода. И все виртуальные методы B перечислены в предупреждениях. Если это важно, D - полный класс.

Я прочитал это с сериализации Boost, и это безопасно игнорировать предупреждение.

Является ли этот метод, который я пытаюсь достичь? Можно ли игнорировать это предупреждение?

Примечание 1: Это не дубликат Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance), я пробовал предлагаемое решение.

Примечание 2: Я также могу отправить диаграмму классов, но это немного сложнее, чем это.

EDIT: Полного предупреждения следующим образом:

warning C4250: 'gge::resource::ImageResource' : inherits 
'gge::graphics::ImageTexture::gge::graphics::ImageTexture::drawin' 
via dominance 

gge::resource::ImageResource является большим на чертеже, gge::graphics::ImageTexture является D, drawin является одним из шести методов я получаю предупреждение для.

+0

Реализация многих интерфейсов - признак того, что ваш класс может нести слишком большую ответственность. Рассмотрим рефакторинг его на несколько меньших классов. – hammar

+0

@hammar: Я пробовал, но проблема не в классе, Big - это просто изображение, но есть много интерфейсов для поддержки разных графических типов. Функции, требующие услуг определенного интерфейса, должны использовать наименьший интерфейс, который удовлетворяет их потребности. В качестве образца, используя эти свойства, я могу заменить систему частиц как указатель мыши. Короче говоря, я не мог разбить на более мелкие классы. –

+1

Рассмотрите образец украшения (http://en.wikipedia.org/wiki/Decorator_pattern) в качестве альтернативы подклассу. –

ответ

16

Все абсолютно справедливо. Компилятору разрешено предупреждать о допустимом коде, здесь нет проблем. Вы можете попытаться отключить предупреждение с помощью объявления using. Если это не работает (возможно, из-за ошибки MSVC), отключите его с помощью pragma.

+0

Если вы используете, я не собирался задавать вопрос, прагма должна сделать трюк. Спасибо за ответ. –

+0

Я слышал, что для некоторых людей 'использование' работает или выходит из строя в зависимости от несущественного пробела в исходном файле. Если это правда, там определенная ошибка компилятора. –

+0

Пожалуйста, покажите код для использования объявления. –

 Смежные вопросы

  • Нет связанных вопросов^_^