首页 > 解决方案 > 如何使用指向函数的指针在基类构造函数中调用派生类的方法?

问题描述

免责声明:我是一名 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;
}

问题是我做错了什么,我在输出中得到了垃圾?

标签: c++inheritanceconstructor

解决方案


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 对象还没有被构造。


推荐阅读