如何从父类构造函数引用重写静态方法?

时间:2016-08-27 15:41:17

标签: c++ oop

所以我们有一些类(即Button)及其采用void函数的方法。 我们还有父类State,它具有用于asign的静态方法buttonAction 到Button实例。问题是State的子类必须有一个覆盖选项 static方法buttonAction和此方法必须由父类State构造函数分配给按钮。

它必须是这样的:

代码:

MyState st;
button.click();

期望的输出:

MyState::buttonAction!

但我得到了:

State::buttonAction!

相关的.cpp文件:

#include <iostream>
#include <cstdio>

class Button
{
public:
    void setAction(void(*foo)(void));
    void click();
private:
    void(*foo)(void);
};

void Button::setAction(void(*foo)(void)) { this->foo = foo; }

void Button::click() { this->foo(); }

Button button;

class State
{
public:
    State();
private:
    static void buttonAction();
};

State::State()
{
    button.setAction(this->buttonAction); // pointer to state's buttonAction
}

void State::buttonAction()
{
    printf("State::buttonAction!");
};

class MyState : State
{
private:
    static void buttonAction(); // overridden buttonAction 
};

void MyState::buttonAction()
{
    printf("MyState::buttonAction!");
};

int main() {
    MyState st;
    button.click();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

让MyState的构造函数覆盖它:

MyState::MyState()
{
    button.setAction(&buttonAction)l
}

在超类最初调用setAction()以将回调指向其自己的静态类函数之后,这将覆盖它,并将其重新指向MyState的静态类函数。