指向基类中成员函数的指针数组

Posted

技术标签:

【中文标题】指向基类中成员函数的指针数组【英文标题】:Array of pointers to member functions in base class 【发布时间】:2016-03-05 15:03:26 【问题描述】:

我需要一个指向此类基类中成员函数的指针数组

class Base 
public:
    typedef int(Base::*func)();
    func f[3];
    Base();
    void run();
;

void Base::run()

    cout << (this->*f[0])() << endl;
    cout << (this->*f[1])() << endl;
    cout << (this->*f[2])() << endl;

函数 run() 对于所有子类都是相同的。但是数组 f[] 中的指针将引用将在子类中定义的成员函数。

class Child: public Base 
public:
    typedef int(Child::*func)();
    func f[3];
    int A();
    int B();
    int C();
    Child();
;
int Child::A()

    return 1;

int Child::B()

    return 2;

int Child::C()

    return 3;

Child::Child()

    f[0] = &Child::A;
    f[1] = &Child::B;
    f[2] = &Child::C;

如果我在程序中运行此代码,我会遇到问题

Child x;
x.run(); 

如何做到这一点?

【问题讨论】:

你看起来像是在尝试重新发明虚函数。 你遇到了什么问题? 程序已运行但操作不正确 【参考方案1】:

您在这里面临两个主要障碍。

第一,你永远不会初始化Base::f,但这就是run 的作用。您在子类中声明一个成员f 并在构造函数中对其进行初始化。 Basef 从未初始化,并且充满了垃圾。当您调用run 时,它会尝试使用这些随机值。这是未定义的行为。

int(Base::*)()int(Child::*)() 是两种截然不同且不兼容的类型。您看起来想用指向子函数的指针填充数组并从基类调用它们。

有几种方法可以解决这个问题:

    您可以将run 设为虚拟并在子类中实现它以调用函数。 您可以将函数放在基类中并使它们成为虚拟函数,因此指向它们的指针将调用派生版本。 您可以创建一个 std::function 对象数组而不是指针。

【讨论】:

【参考方案2】:

这行得通:

class Base 
public:
    typedef int(Base::*func)();
    func f[3];
    virtual int A()  return 0; 
    virtual int B()  return 0; 
    virtual int C()  return 0; 
    Base() ;
    void run()
    
        cout << (this->*f[0])() << endl;
        cout << (this->*f[1])() << endl;
        cout << (this->*f[2])() << endl;
    
;

 class Child: public Base 
     public:
     int A()  return 1; 
     int B()  return 2; 
     int C()  return 3; 
     Child()
     
         f[0] = &Base::A;
         f[1] = &Base::B;
         f[2] = &Base::C;
    
;

【讨论】:

请解释为什么这样有效,以及为什么原来没有。 这得益于虚函数和后期绑定的机制。

以上是关于指向基类中成员函数的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

获取指向基类受保护成员函数的函数指针

基类的函数指针指向子类的成员函数?

指向基类错误成员函数的指针[关闭]

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]

在 C++ 中将指向基类的指针传递给派生类的成员函数

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?