c++ - 指向基本虚拟成员函数的指针
问题描述
如果它是一个虚函数并且在派生类中被覆盖,有没有办法在基类中的成员函数上创建一个指针?
考虑如下代码
#include <iostream>
#include <functional>
struct Base
{
virtual void g() const
{
std::cout << "Base" << std::endl;
}
};
struct Derived : Base
{
virtual void g() const override
{
std::cout << "Derived" << std::endl;
}
};
int main()
{
Derived d;
(d.*(&Base::g))();
std::mem_fn(&Base::g)(d);
return 0;
}
尽管我在 Base::g 上做了一个指针,但它会打印两次“Derived”。有没有办法让函数 g 保持虚拟和被覆盖,并获取将为 d 打印“Base”的成员函数指针?
解决方案
只需调用基本函数
int main()
{
Derived d;
d.g();
Base* b = &d;
b->Base::g();
//or
d.Base::g();
//or
auto callLater = [&d]() { d.Base::g();};
callLater();
return 0;
}
输出
Derived
Base
Base
Base
这可以作为函数的指针;但它需要指向对象的成员函数 Base::g() 。
推荐阅读
- python - 按月和年分组并对Python中的所有列求和
- ansible - 如何在 ansible playbook 中使用修剪和 if 条件?
- java - 导出创建新文件的应用程序的可运行 JAR
- r - 有没有办法从 ASC 文件中逐行读取并在特定子字符串后检查它?
- linux-kernel - 如何调试 MDIO 总线扫描失败?
- vue.js - 如何在 Vue.js 中访问嵌套数组中的数据?
- python - audioread.exceptions.NoBackendError Midi 文件
- python - 为什么环境收集器和 doctree-resolved 之间的节点实例不同?
- ios - 在将相机从二维码移开之前不会播放音频 - iOS
- php - Codeigniter:添加 order_by 查询时排序不工作