如何在编译或运行时检测非虚拟覆盖
How to detect non-virtual-override at compile or runtime
我想检测一个函数是否在派生类中被(静态)覆盖:
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++在这方面还不是很擅长:(
相关文章:
- 使用CMake检测支持的C++标准
- 虚拟决赛作为安全
- 当套接字连接断开时检测C/C++Unix
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C/C++预处理器是否可以检测一些编译器选项
- C++无法定义虚拟函数 OUTER 类和头文件
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 如何在 Windows API 中检测带有虚拟代码的非字母?
- 如何在编译时检测C 17中是否没有虚拟基础
- C++如何检测您的应用程序正在运行的虚拟机已成为焦点
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- 是否有某种方法可以检测是否使用非虚拟基析构函数错误地删除了类
- 如何在编译或运行时检测非虚拟覆盖
- 如何在vmware Esx(i) server /Vcenter中检测虚拟机磁盘是GPT还是MBR
- 如何检测方法是否为虚拟方法
- 在Windows 10上检测活动的虚拟桌面-任务视图-虚拟桌面切换器