c ++检查函数在运行时是否被重载

时间:2012-01-04 17:34:34

标签: c++ virtual

我有一个抽象接口I,其中定义了virtual void Foo()以及其他功能。有些子类中重新定义了Foo,而其他Foo则没有。{1}}。现在,给定I* pi,是否可以知道是否重新定义了Foo?也就是说,我想知道pi->Foo()是否会调用I::Foo()X::Foo(),其中X是某种类型,其中Foo被重新定义。我认为这可以通过比较&I::Foo&pi->Foo之间的函数指针来完成,但不确定如何。请注意,我不知道运行时pi的具体类型,因此我无法直接通过&I::Foo != &X::Foo比较函数指针。

ADD: 因此,很多人指出设计是坏的,违背了抽象和虚函数的概念。我这样做的主要原因是绕过空函数调用以提高速度。由于Foo()中的某些内容为空,因此当pi为空时,我希望将其从Foo() s的向量中删除。

2 个答案:

答案 0 :(得分:1)

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

  

ISO C ++禁止获取绑定成员函数的地址以形成指向成员函数的指针。

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

答案 1 :(得分:0)

您可以dynamic_cast指向覆盖Foo的每个子类型的指针,如果它是其中一种类型,它将调用该子项。您不能使用要使用的->语法获取成员函数的地址。

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