问题描述
我试图在虚拟函数周围使用 #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 (将#修改为@)