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