Microsoft иногда предупреждает об «устаревших функциях», которые не помечены как таковые комитетом по спецификациям, или об определенных «хороших или плохих практиках».
Наличие невиртуального деструктора в объекте, который имеет виртуальные методы, представляет собой потенциальный риск, если этот объект предназначен для использования в полиморфной среде ООП (где delete pObject
должен правильно также delete pDerived
, даже если он просматривается с помощью pObject
). Но это всего лишь одна из парадигм поддержки С++... поэтому такое предупреждение может быть бессмысленным:
Также p->dosomething()
не вызывает Derived::dosomething
, если dosomething
не является виртуальным, но для этого не генерируется предупреждение.
Для меня, delete p
, попытка P::~P()
привести к вызову D::~D()
не является особым случаем и не должна заслуживать предупреждения.
Но, к сожалению, ООП была первой парадигмой, которую С++ изначально поддерживал, и парадигмой, на которую ссылается большинство программистов, распространяемых книг и учителей, поэтому они развернули передовую практику «не выводить, если деструктор не виртуальный», к сожалению, сообщается также Скоттом Мейерсом в его «Эффективном C ++», что сделало его «популярным» и на него постоянно ссылаются, даже если нет технических причин для его дальнейшего существования.
Сегодня это бессмысленно, как и большинство фраз «не делай этого, не делай того» (включая знаменитое «перейти к вредным действиям» Дейкстры, которое сделало много нового акцента на структурном программировании, но также и множество нелепых способов крутитесь вокруг, чтобы избежать этого. Ха ... Miscrosoft еще не предупредил об использовании goto ... Может быть, Мейерс более влиятельный, чем Джикстра??)
Единственная хорошая практика — «НИЧЕГО не делай, если не знаешь, что делаешь!». Ничто не запрещает принять предложение, но "лучшая практика" - это не "всегда хорошая практика" (иначе она не будет "лучшей": будет просто "только") и компилятор (как формальный инструмент) не должен предупреждать о субъективных чувства.
person
Emilio Garavaglia
schedule
08.11.2011