从基类调用重写的方法

德鲁波尔

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

要求回调应始终调用foobar被最新派生类覆盖的方法

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

您将虚拟方法与派生对象绑定不正确,将派生对象切片。试试这个(*被删除)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Ada中的基类调用重写的方法

来自分类Dev

使Moq调用尚未被重写的基类方法

来自分类Dev

从基类调用基方法

来自分类Dev

在派生类中调用重写的方法

来自分类Dev

在C ++中调用Helper类的重写方法

来自分类Dev

在派生类中调用重写的方法

来自分类Dev

强制方法从基类调用基方法

来自分类Dev

强制调用基类方法

来自分类Dev

模板基类的调用方法

来自分类Dev

强制调用基类方法

来自分类Dev

如何从父类的基类调用方法

来自分类Dev

派生类调用父类的方法调用重写的虚方法调用错误的方法

来自分类Dev

如何从重写的子类方法调用超类的继承方法?

来自分类Dev

为什么尽管使用了super关键字,但派生类方法仍未从基类中调用重写方法?

来自分类Dev

重写基类的方法时该如何模拟它?

来自分类Dev

Java:强制基类使用基类方法而不是重写方法

来自分类Dev

从类中调用实现的接口重写方法

来自分类Dev

如何从两个父类中调用“重写”方法?

来自分类Dev

Son中的重写方法是否可以调用C ++中父亲模板类的重写方法?

来自分类Dev

FSharp在基类中调用通用方法

来自分类Dev

C ++调用基类方法slices对象

来自分类Dev

从基类C#调用子类方法

来自分类Dev

为什么基类调用子类的方法?

来自分类Dev

调用基类方法时集合变空

来自分类Dev

为什么要调用基类方法?

来自分类Dev

从子类调用基类的扩展方法

来自分类Dev

基类中的重写函数

来自分类Dev

为什么基类指针指向基类中的纯虚方法而不是派生类中的重写方法?

来自分类Dev

未被调用的重写方法