如何在编译或运行时检测非虚拟覆盖

How to detect non-virtual-override at compile or runtime

本文关键字:检测 虚拟 覆盖 运行时 编译      更新时间:2023-10-16

我想检测一个函数是否在派生类中被(静态)覆盖:

template< typename T >
struct A{ void func(){ static_cast<T*>(this)->func(); } };
struct B: A<B>{};
struct C: A<C>{ void func(){  std::cout << "class C" << std::endl;  };
C c;
if(&A<C>::func != &C::func)
  c.func();

显然,如果'func'没有重写,我不会调用它。我喜欢直接回答我的问题。告诉实际问题,以确定超载。

如果你能给出解决这个问题的其他方法,我也会很感激。

好的,它编译了,我还没有找到我的实际代码的区别,那没有。顺便说一下,在我的实际代码中,我不只是试图避免调用函数,还有更多。我很想知道函数是否被重写了,或者是否需要使用完全不同的方法。

此处有效。顺便说一句,最简单的方法是将A中的f()定义为空:

struct A{ void func(){ } };

我不知道有什么方法可以做到你所要求的,但是你可以使用一些很酷的模式来实现使用模板的"静态多态性"。这消除了您在运行时期间对使用v表的依赖(实际上,没有一个v表用于实现类似多态的效果)。因此,您应该能够在编译时检查您需要的函数是否可用。

在维基百科的模板元编程条目中有一点介绍:

http://en.wikipedia.org/wiki/Template_metaprogramming

它会使你的代码更复杂,所以我认为你应该考虑重新设计不需要这个特性-它更像是一个反射属性,而c++在这方面还不是很擅长:(