Что делает C4250 VC ++ предупреждение среднего?

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

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

11
задан sharptooth 3 February 2010 в 07:51
поделиться

3 ответа

Я согласен с другими плакатами, которые вы уже делаете правильно. Однако в таких ситуациях вы могли бы попробовать преобразование $ класса значение на значение, которое можно использовать в качестве индекса в ассоциативном массиве, не в отличие от того, что @ Ghostdog74 пытался сделать выше.

$gradeindex = (int)$grade / 10; // 10 since we want 10-19 = 1, etc..
$gradenames = array('10' => 'A+', '9' => 'A', '8' => B, ..... );

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

$gradeindex = (int)$grade / 10; // 10 since we want 10-19 = 1, etc..
switch ($gradeindex) {
  case 10:
  case 9:
    $gradename = 'A';
    break;
  case 8:
    $gradename = 'B';
    break;
  case 7:
    $gradename = 'C';
    break;
  default:
    $gradename = 'Failed';
}
echo $gradename;

, но, как уже говорилось, вы в основном лучше всего с вашим текущим , если утверждение Отказ

-121--4180353-

Предупреждение указывает на то, что если какое-либо слабое классов зависит от виртуальных операций виртуальных операций, которые реализованы в доминирующих , Затем эти операции могут изменить поведение из-за того, что они связаны в иерархии алмазной наследования.

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
}

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

22
ответ дан 3 December 2019 в 01:24
поделиться

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

15
ответ дан 3 December 2019 в 01:24
поделиться

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

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

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

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

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

2
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: