Что делает Визуальный C C4250 + предупреждение среднего на практике? Я прочитал связанную страницу MSDN, но я все еще не получаю, какова проблема.
О чем компилятор предупреждает меня и какие проблемы могли возникнуть, если я игнорирую предупреждение?
Я согласен с другими плакатами, которые вы уже делаете правильно. Однако в таких ситуациях вы могли бы попробовать преобразование $ класса
значение на значение, которое можно использовать в качестве индекса в ассоциативном массиве, не в отличие от того, что @ 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;
, но, как уже говорилось, вы в основном лучше всего с вашим текущим , если
утверждение Отказ
Предупреждение указывает на то, что если какое-либо слабое
классов зависит от виртуальных операций
виртуальных операций, которые реализованы в доминирующих
, Затем эти операции могут изменить поведение из-за того, что они связаны в иерархии алмазной наследования.
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
поведение операции изменилось не из-за переопределенного метода выше или ниже в иерархии. , но в классе брата в иерархии наследования, когда они называются из , полученные
. Обратите внимание, что это имеет смысл из видимости , полученного
, это вызывает операцию, которая зависит от виртуального метода, реализованного в доминирующих
.
Это означает, что компилятор заметил, что вы используете менее известную функцию виртуального наследования, для которой она имеет название. Понятия не имею, почему они решили, что это предупреждение - хорошая идея, но практического значения это не имеет; код должен работать так, как указывает язык, он не указывает на недостаток компилятора или что-то еще.
В примере связанного у вас есть алмаз
, который наследует как weak
, так и ] dominant
, которые фактически наследуются от vbc
, но только dominant
переопределяет func ()
В C ++ возникает проблема, когда у вас есть такая структура когда вы не используете виртуальное наследование. Однако с виртуальным наследованием проблема решена, поэтому предупреждение представляет собой просто информацию , сообщающую вам, что если:
weak
реализовал func ()
, тогда вы получите ошибку компилятора.
Я считаю, что если вы знаете, что делаете, вы можете безопасно отключить это предупреждение для всего вашего проекта.