指向虚拟成员功能
Pointers to a virtual member functions
考虑以下代码
class BASE
{
public:
virtual void test_f(){std::cout<<"BASE::test_fn";}
};
class DERIVED:public BASE
{
public:
virtual void test_f(){std::cout<<"DERIVED::test_fn";}
};
void (BASE::*p_base)() = &BASE::test_f;
p_base是指向类成员函数的指针,但它是多态性的。这意味着
DERIVED a;
(a.*p_base)();
将打印派生:: test_f
我如何获取指向基类的test_f的指针以进行非多态性调用?
示例:
#include <iostream>
#include <functional>
class BASE
{
public:
virtual void test_f(){std::cout<<"BASE::test_fn";}
};
class DERIVED:public BASE
{
public:
virtual void test_f(){std::cout<<"DERIVED::test_fn";}
};
int main()
{
// prints Derived
void (BASE::*p_base)() = &BASE::test_f;
DERIVED a;
(a.*p_base)();
auto f = std::mem_fun(&BASE::test_f);
f(&a);
// prints Base
a.BASE::test_f();
auto callLater = [&a]() { a.BASE::test_f();};
callLater();
}
相关文章:
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 钻石继承虚拟成员铸造与指针
- 如果我必须覆盖非虚拟成员函数怎么办
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 非虚拟成员函数是否可以使用模板参数?
- 如何将已实现的虚拟成员函数作为参数传递
- 调用虚拟成员类的方法
- 睡眠影响 std::thread 调用哪个虚拟成员函数?
- 在多态性中重新定义功能(虚拟),具有不同数量的参数
- GTEST:嘲笑非虚拟成员函数
- 使SDL称为纯虚拟成员作为事件回调
- 在C中使用具有虚拟成员(即非POD)的C++结构
- 虚拟和非虚拟成员函数的调用方式有什么区别?
- 默认情况下是虚拟成员函数
- 是否可以在不重写派生类中记录虚拟成员?
- 为什么在已删除的指针上调用非虚拟成员函数是未定义的行为
- C++标准是否保证了没有虚拟成员函数的类类型的大小
- 使用虚拟成员从课堂制作 POD
- C++合成的move构造函数如何受到volatile和虚拟成员的影响
- 指向虚拟成员功能