在虚函数周围使用 #ifdef 预处理器会导致与库链接的程序中出现运行时错误

问题描述

我试图在虚拟函数周围使用 #ifdef 预处理器。代码的简化版本如下所示:

class Base
{
#ifdef ENABLE_FLAG
    virtual void function1();
#endif //ENABLE_FLAG

    virtual void function2();
    virtual void function3();
};

class Child : public Base
{
#ifdef  ENABLE_FLAG
    void function1() override;
#endif //ENABLE_FLAG

    void function2() override;
    void function3() override;
};

代码编译得很好。但是,当我的应用程序调用 Child::function3() 时,由于某种原因,它实际上最终调用了 Child::function2()。我认为预处理器以某种方式弄乱了虚拟表。

我在 Visual Studio 2017 中运行调试模式。我很好奇这个运行时问题的原因是什么。这是依赖于编译器的行为吗?

另一件值得注意的有趣事情是,如果我确保定义了 ENABLE_FLAG 并删除 Child 类中的 #ifdef 子句并将其保留在 Base 类中,那么编译器实际上是在抛出编译错误。它在这里有什么不同?

更新:这个类在主程序和库中都使用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)