c++ - 如何使用指向函数的指针在基类构造函数中调用派生类的方法?
问题描述
免责声明:我是一名 C 开发人员,这是我第一次在 C++ 中尝试这样的事情。我对这门语言的经验为零。
我有一个类Bob
,它有一个指向myFunction
作为私有成员的函数的指针。
我想继承该类Bob
并使用基类构造函数将派生类的方法传递给指针函数。
这是我的代码:
#include <iostream>
using FuncHandler = void (*)(int x);
class Bob
{
protected:
Bob(FuncHandler x)
{
myFunction = x;
// When I call the function here
// I get garbage...
// x value is = 932452288
myFunction(10);
}
private:
FuncHandler myFunction;
};
class Alice : public Bob
{
public:
Alice() : Bob(reinterpret_cast<FuncHandler>(&Alice::foo))
{
}
void foo(int x);
};
void Alice::foo(int x)
{
std::cout << "x value is = " << x << "\n";
}
int main(void)
{
Alice obj1;
return 0;
}
问题是我做错了什么,我在输出中得到了垃圾?
解决方案
using FuncHandler = void (*)(int x);
是函数指针的方便名称。
Alice 的void foo(int x);
不是一个函数,它是一个成员函数。成员函数与独立函数不同。
幸运的是,在这种特殊情况下,代码不需要访问作为 Alice 的成员函数的函数,它可以使用与函数指针兼容的静态类函数。假设签名匹配,在这种情况下它们匹配。
更改void foo(int x);
为static void foo(int x);
。
然后更改Alice() : Bob(reinterpret_cast<FuncHandler>(&Alice::foo))
为Alice() : Bob(&Alice::foo)
,代码全部设置。
注意:如果该foo
函数需要访问 Alice 的实例状态,则会出现问题,因为在代码中的那个构造点,Alice 对象还没有被构造。
推荐阅读
- excel - 如何在 Excel 中将文本更改为数字?
- python - 在 Python 中修改嵌套列表的元素时出现问题
- php - 在 Woocommerce 中排除特定产品的字段验证
- javafx - VSCode 中的 JavaFX-11:错误:无法找到或加载主类 Files\Java\javafx-sdk-11.0.2\lib
- android - 在Play商店上传apk时出现问题
- java - 用于 mac 的 Java 应用程序
- google-console-developer - 在 Google Developers 控制台中找不到 NBU Payments API
- indexing - ArangoDB HTTP/AQL 创建索引
- c# - 在回发时,我如何检查哪个 html 按钮在后面的代码中导致回发
- firebase - 在 FireStore 中排序数据