gpt4 book ai didi

c++ - 从基类调用重写的方法

转载 作者:行者123 更新时间:2023-12-01 21:53:45 25 4
gpt4 key购买 nike

在以下场景中如何从基类调用重写的 bar 方法?

要求回调应始终调用方法 foo,该方法应调用由最新派生类覆盖的 bar

#include <iostream>
#include <functional>
#include <typeinfo>

using namespace std;

std::function<void(void)> callback = nullptr;

class Base {
public:
Base(Base* ptr) { callback = std::bind(&Base::foo, *ptr); }

virtual ~Base() {}

virtual void foo() {
bar(); // How call foo() from Derived instead of Base?
}
virtual void bar() { cout << "Base::bar" << endl; }
};

class Derived : public Base {
public:
Derived() : Base(this) {}

virtual void bar() override { cout << "Derived::bar" << endl; }
};

int main() {
cout << "Hello World" << endl;
Base* b = new Derived();

cout << "**callback**" << endl;
callback(); // output should be 'Derived::bar'

return 0;
}

最佳答案

您将虚拟方法与派生对象绑定(bind)不当,从而对派生对象进行了切片。试试这个(* 已删除)

Base(Base *ptr){
callback = std::bind(&Base::foo, ptr);
}

关于c++ - 从基类调用重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61804666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com