c++检查函数在运行时重载或未重载
c++ check function is overloaded or not in runtime
我有一个抽象接口I
,其中定义了virtual void Foo()
以及其他函数。有一些子类中Foo
被重新定义,而另一些子类则没有Foo
。现在,给定I* pi
,是否可以知道Foo
是否被重新定义?也就是说,我想知道pi->Foo()
是调用I::Foo()
还是X::Foo()
,其中X
是重新定义Foo
的某种类型。我认为这可以通过比较&I::Foo
和&pi->Foo
之间的函数指针来完成,但不确定具体如何。请注意,我不知道运行时pi
的具体类型,所以我不能直接通过&I::Foo != &X::Foo
来比较函数指针。
添加:因此,许多人指出这种设计是糟糕的,违背了抽象和虚拟功能的概念。我这样做的主要原因是绕过空函数调用来提高速度。由于某些Foo()
是空的,所以当Foo()
为空时,我想将其从pi
s的向量中删除。
您无法从&pi->Foo
中找到,因为GCC错误消息会告诉您,
ISO C++禁止使用绑定成员函数的地址来形成指向成员函数的指针。
如果您想在运行时了解对象的类型,请使用typeid
。否则,请重新考虑您的设计。
您可以将指向重写Foo
的每个子类型的指针dynamic_cast
,如果它是这些类型之一,它将调用该子类型。不能使用要使用的->
语法获取成员函数的地址。
但所有这些都表明,在做这样的事情之前,我真的会重新思考你的设计。接口和虚拟方法的目的是避免需要知道您正在处理的类型!
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 尝试使用浮点参数运行重载函数时出错
- 枚举上的重载<<运算符会导致运行时错误
- 链表重载运算符 = 运行时错误
- 循环unique_ptrs的向量,并为运行时类型调用正确的重载
- c++检查函数在运行时重载或未重载
- 根据运行时数据选择函数重载
- 使用重载复合赋值操作符时的运行时错误