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

时间:2016-03-05 15:03:26

标签: c++ arrays member-function-pointers

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

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(); 

怎么做?

2 个答案:

答案 0 :(得分:0)

你在这里遇到两个主要障碍。

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

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

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

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

答案 1 :(得分:0)

这有效:

render()