运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())
runtime-check whether an instance (Base*) override a parent function (Base::f())
如何确定基(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
返回类型。
相关文章:
- 构造函数采用 Base&不被调用
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- 候选函数不可行:没有从 std::vector<derived> 到 std::vector <base>的已知转换
- 运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- static_assert:派生"must"中的某个函数隐藏了Base的类函数
- 如何在 c++ 中编写 log base 10 函数
- 使用 static_cast、dynamic_cast 或显式转换进行派生指向 Base 指针转换的指针不会调用 base 函数
- 我如何调用基类的虚拟函数定义,这些定义在Ampract Base类和C 中的派生类中都有定义
- 如何从Base析构函数中将Base*与Derived*列表进行匹配
- 最佳base-10仅ITOA()函数
- 函数采用<Base>可以接受 std::auto_ptr 的 std::auto_ptr<Derived>
- 为什么当派生类调用 base 的纯虚函数时 g++ 不抱怨?
- 除当前类型外,可用于从Base派生的所有类型的隐式构造函数
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换
- 将 vector<Derived><shared_ptr> 传递给需要 vector<shared_ptr 的函数<Base>>
- 让 foo(derived_object) 调用 foo(Base const&) 而不是模板函数?
- 为什么即使 base 具有用户声明的构造函数也会发生零初始化
- C++在重载函数中使用"base"函数