Понякога Microsoft предупреждава за „отхвърлени функции“, които не са маркирани като такива от комитета по спецификациите, или за определени „добри или лоши практики“.
Наличието на невиртуален деструктор в обект, който има виртуални методи, е потенциален риск, ако този обект е проектиран да напусне полиморфна ООП среда (където delete pObject
трябва правилно също така delete pDerived
, дори ако се гледа с pObject
). Но това е само една от парадигмите за поддръжка на C++... следователно такова предупреждение може да е безсмислено:
Също така p->dosomething()
не извиква Derived::dosomething
, ако dosomething
не е виртуален, но не се генерира предупреждение за това.
За мен delete p
преструването, че P::~P()
води до извикване на D::~D()
, не е специален случай и не трябва да заслужава предупреждение.
Но - за съжаление - ООП беше първата парадигма, която C++ първоначално поддържаше и парадигмата, за която се позовават повечето програмисти и циркулиращи книги и учители, така че те внедриха най-добрата практика „не извличай, ако деструкторът не е виртуален“, за съжаление докладвано също от Скот Майерс в неговия „Ефективен C++“, като по този начин го прави „популярен“ и непрекъснато се споменава също, ако няма техническа причина да продължи да съществува.
Днес е безсмислен смисъл като повечето от „не правете това, не правете онова“ (включително известното „goto се счита за вредно“ от Dijkstra, което постави много нов акцент върху структурираното програмиране, но също така и много нелепи начини за завъртете се, за да го избегнете. Ха ... Microsoft все още няма предупреждение за използването на goto ... Може би Майерс е по-влиятелен от Джикстра??)
Единствената добра практика е „не правете НИЩО, ако не знаете какво правите!“. Нищо не забранява да се приеме предложение, но „най-добрата практика“ не е „винаги добра практика“ (в противен случай няма да е „най-добра“: просто ще бъде „само“) и компилаторът (като формален инструмент) не трябва да предупреждава за субективни чувства.
person
Emilio Garavaglia
schedule
08.11.2011