我有一个抽象接口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的向量中删除。
答案 0 :(得分:1)
您无法从&pi->Foo
找到,因为GCC错误消息会告诉您,
ISO C ++禁止获取绑定成员函数的地址以形成指向成员函数的指针。
如果您想在运行时知道对象的类型,请使用typeid
。否则,重新考虑你的设计。
答案 1 :(得分:0)
您可以dynamic_cast
指向覆盖Foo
的每个子类型的指针,如果它是其中一种类型,它将调用该子项。您不能使用要使用的->
语法获取成员函数的地址。
但是所有这些说我会在做这样的事情之前重新考虑你的设计。接口和虚拟方法的要点是避免需要知道您正在处理的类型!