c++检查函数在运行时重载或未重载

c++ check function is overloaded or not in runtime

本文关键字:重载 运行时 检查 函数 c++      更新时间:2023-10-16

我有一个抽象接口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()为空时,我想将其从pis的向量中删除。

您无法从&pi->Foo中找到,因为GCC错误消息会告诉您,

ISO C++禁止使用绑定成员函数的地址来形成指向成员函数的指针。

如果您想在运行时了解对象的类型,请使用typeid。否则,请重新考虑您的设计。

您可以将指向重写Foo的每个子类型的指针dynamic_cast,如果它是这些类型之一,它将调用该子类型。不能使用要使用的->语法获取成员函数的地址。

但所有这些都表明,在做这样的事情之前,我真的会重新思考你的设计。接口和虚拟方法的目的是避免需要知道您正在处理的类型!