首先,让我们注意,这个问题与Visual Studio对DLL的处理有关。GCC和Clang都有一个稳定的ABI(Itanium ABI),可以保证用不同版本编译的库的兼容性。
现在,如前所述,您在这里面临的问题是ABI的不稳定性,但是ABI的部分是稳定的(虚拟表布局),否则所提出的策略将根本不起作用。
因此,只要有一个
virtual
析构函数应该工作。由于通过虚拟表进行调用,因此不会出现名称损坏问题。
此外,请注意,在现代C++中,返回原始指针是一个no no,但名称损坏会阻止使用智能指针。。。
// Foo.h
class Foo {
public:
virtual int get() = 0;
virtual ~Foo();
protected:
Foo() = default;
Foo(Foo&&) = default;
Foo(Foo const&) = default;
Foo& operator=(Foo) = default;
};
// WARNING: immediately capture this Foo* in a smart pointer,
// or suffer from memory leak (and worse).
Foo* createFoo(); // factory behind
// Foo.cpp
Foo::~Foo() {} // not inline