As given in the following example we should expect the derived destructor to be called, but is not:
type D extends object
declare virtual destructor
end type
destructor D
print "~D()"
end destructor
var x = new D
dim as object ptr y = x
'' delete derived object through base pointer
delete y
For comparison if we have a second derived class, we can destruct the instance through a base pointer:
type VirtualObject extends object
declare virtual destructor
end type
destructor VirtualObject
print "~VirtualObject()"
end destructor
type D extends VirtualObject
declare virtual destructor
end type
destructor D
print "~D()"
end destructor
var x = new D
dim as VirtualObject ptr y = x
'' delete derived object through base pointer
delete y
/' OUTPUT:
~D()
~VirtualObject()
'/
Reported at https://www.freebasic.net/forum/viewtopic.php?t=31566
This appears to mess with extern "c++"
handling and we get a (likely) related issue:
extern "c++"
type foo extends object
a as integer
declare virtual destructor
end type
end extern
destructor foo
end destructor
the linker returnsundefined reference to foo::~foo()
'OBJECT' has no virtual 'destructor()', and even it has no 'destructor()' at all (only 'constructors').