c++ - 如何从父类构造函数中引用重写的静态方法?

标签 c++ oop

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

它必须像这样工作:

代码:

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;
}

最佳答案

让 MyState 的构造函数覆盖它:

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

父类(super class)初始调用setAction()将回调指向它自己的静态类函数后,这将覆盖它,并将它重新指向MyState的静态类功能。

关于c++ - 如何从父类构造函数中引用重写的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182893/

相关文章:

php - 在 PHP 中学习 OOP。这是正确的方法吗?

c++ - 在窗口模式下设置/获取我的绝对鼠标位置

c++ - 在 C++ 中,我可以将一个集合插入一个集合作为值的映射中吗?

c++ - C++中会出现脆弱基类问题吗?

javascript - NodeJS 使用另一个文件中的类

java - 为什么要在 OOPS 中定义重载方法?

swift - 以更加面向对象的方式根据三个选择之一执行操作

c++ - 我如何告诉一个 wstring 我正在喂它的字符串已经是一个 wstring?

c++ - 用 str(const char*) 设置 std::stringstream 的内容会产生奇怪的后果

JavaScript oop : Designing classes correctly