Что означает предупреждение C4250 VC ++? - PullRequest
11 голосов
/ 03 февраля 2010

Что означает C4250 Визуальное предупреждение C + в практическом плане? Я прочитал связанную страницу MSDN, но все еще не понимаю, в чем проблема.

О чем меня предупреждает компилятор и какие проблемы могут возникнуть, если я проигнорирую предупреждение?

Ответы [ 4 ]

22 голосов
/ 03 февраля 2010

В предупреждении указывается, что если какие-либо операции класса 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.

14 голосов
/ 03 февраля 2010

Это означает, что компилятор заметил, что вы используете менее известную функцию виртуального наследования, для которой у него есть имя.Я понятия не имею, почему они думают, что было бы хорошей идеей сделать это предупреждение, но это не имеет никакого практического значения;код должен работать так, как указывает язык, он не указывает на недостаток компилятора или что-то в этом роде.

2 голосов
/ 19 июля 2013

В VS2012 вы можете получить это предупреждение за «ничего», но за наследование класса от iostream.Отзыв MS article гласит, что это предупреждение можно игнорировать в этом случае.

Если вы не хотите подавлять такого рода предупреждения, но хотите кросс-платформенный код, который неСоздайте это предупреждение для мусора в vs2012, статья о C4250 предлагает в CodeInPro добавить эти строки, которые ничего не делают, в ваш код в классе, унаследованном от iostream:

void _Add_vtordisp1() { } // Required to avoid VC++ warning C4250
void _Add_vtordisp2() { } // Required to avoid VC++ warning C4250
2 голосов
/ 03 февраля 2010

В связанном примере у вас есть diamond, который наследует weak и dominant, которые оба наследуются практически от vbc, но только dominant переопределяет func()

Существует проблема в C ++, когда у вас есть такая структура, когда вы не используете виртуальное наследование. Однако, с виртуальным наследованием, проблема решена, поэтому предупреждение - это просто information , сообщающее, что если:

  1. Вы не использовали виртуальное наследование, ИЛИ
  2. weak реализовано func()

тогда вы получите ошибку компилятора.

Итак, я считаю, что если вы знаете, что делаете, вы можете безопасно отключить это предупреждение для всего вашего проекта.

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