运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())

runtime-check whether an instance (Base*) override a parent function (Base::f())

本文关键字:Base 函数 覆盖 是否 检查 运行时 实例      更新时间:2023-10-16

如何确定基(B(类的指针是否(多态性(覆盖基类的某个虚函数?

class B{
public: int aField=0;
virtual void f(){};
};
class C : public B{
public: virtual void f(){aField=5;};
};
class D: public B{};
int main() {
B b;
C c;
D d;
std::vector<B*> bs;
bs.push_back(&b);
bs.push_back(&c);
bs.push_back(&d);
for(int n=0;n<3;n++){
//std::cout<<(bs[n]->f)==B::f<<std::endl;
//should print "true false true"
}
}

我试图将函数指针bs[n]->f的地址与B::f进行比较,但它是不可编译的。

演示

我觉得这个问题可能是重复的,但我找不到(对不起(。

GCC 有一个扩展,允许您获取虚拟成员函数的地址。

这可以像这样使用:

#include <vector>
#include <iostream>
class B{
public: int aField=0;
virtual void f(){};
};
class C : public B{
public: virtual void f(){aField=5;};
};
class D: public B{};
int main() {
B b;
C c;
D d;
std::vector<B*> bs;
bs.push_back(&b);
bs.push_back(&c);
bs.push_back(&d);
for(int n=0;n<3;n++){
// This might need to be: (void*) B{}.*&B::f == (void*) (...)
std::cout << ((void*) &B::f == (void*)(bs[n]->*&B::f)) << 'n';
}
}

演示

您可能会发现此 QA 很有趣。

当然,这是不标准的行为。如果你想在标准C++中出现类似的行为,你实际上可能正在寻找纯虚函数:

class B{
public: int aField=0;
virtual void f() = 0;
};

否则,您必须具有其他一些通信机制,例如f()上的bool返回类型。