Я предполагаю, что в реальном коде ~A()
или ~B()
объявлено виртуальным? (Сообщение об ошибке жалуется на виртуальный деструктор, но в написанном коде ни один из деструкторов не является виртуальным.)
Я полагаю, что виртуальное наследование является причиной вашей проблемы. Деструктор C (неявно определенный) должен сначала вызвать ~B()
, а затем, поскольку C является наиболее производным классом, вызвать ~A()
. (12.4 / 6)
Сгенерированная спецификация исключения для ~C()
требуется, чтобы разрешить распространение любого исключения, потому что оно напрямую вызывает ~A()
, который не имеет спецификации исключения. (15,4 / 13)
И это тогда вызывает вашу ошибку - вы не можете переопределить виртуальную функцию со спецификацией throw()
(деструктор B) с версией, которая может выдать. (15,4 / 3)
Решением было бы поставить throw()
на деструктора А. (Если вы не можете этого сделать, то почему вы делаете это на B?)
Ошибка также не произошла бы без виртуального наследования - потому что тогда деструктор C вызывал бы только деструктор B. (Деструктор Б все равно будет называть А - и вы все еще катаетесь на тонком льду, потому что, если деструктор А бросает, вы идете прямо к terminate()
.)