在 C++ 中声明一个 "interface" 并且不将其 vtable 发送到每个翻译单元

Declaring an "interface" in C++ and not emmiting its vtable to every translation unit

根据 this 的回答,在 C++ 中声明一个 class 的方法在概念上类似于接口是这样的:

class IDemo
{
public:
    virtual ~IDemo() {}
    virtual void OverrideMe() = 0;
};

但是当我这样做时,我收到警告:'IDemo' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit。有没有一种正确的方法可以在项目中使用这样的接口,而不会用这些 vtable 污染每个翻译单元?

您已经有了一个非纯虚函数:析构函数!在自己的翻译单元中定义即可。

// IDemo.h

class IDemo
{
public:
    virtual ~IDemo();
    virtual void OverrideMe() = 0;
};

// IDemo.cpp

IDemo::~IDemo() = default;