当前位置:  开发笔记 > 编程语言 > 正文

为什么没有调用子类的虚函数

如何解决《为什么没有调用子类的虚函数》经验,为你挑选了1个好方法。

我有一个基类和派生类:

plugin.h

#ifndef PLUGIN_H
#define PLUGIN_H

// plugin states
#define PLUGIN_IDLE 0

class Plugin {
public:
  Plugin();
  ~Plugin();

  virtual void loop();
};

#endif

plugin.cpp

#include 
#include "plugin.h"

Plugin::Plugin() {
}

Plugin::~Plugin(){
}

void Plugin::loop(){
  Serial.println("Plugin::loop()");
}

派生类

class OneWirePlugin : public Plugin {
public:
  OneWirePlugin(byte pin);
  void loop();
};

OneWirePlugin::OneWirePlugin(byte pin) {
}

void OneWirePlugin::loop() {
  Serial.println("OneWirePlugin::loop()");
}

我期待调用派生实例的loop()方法将执行OneWirePlugin::loop().

但是,这只发生在我在派生类上下文中调用它时:

Plugin p = Plugin();
Plugin o = OneWirePlugin(ONEWIRE_PIN);
OneWirePlugin q = OneWirePlugin(ONEWIRE_PIN);
p.loop(); // Plugin::loop()
o.loop(); // Plugin::loop()
q.loop(); // OneWirePlugin::loop()

我的虚方法有什么问题可以调用派生的实现,特别是在通过*Plugin指针引用时?



1> BartoszKP..:

loop必须声明为virtual:

class Plugin {

// ...

virtual void loop();

此外,要使多态性起作用,您需要一个指针或引用:

Plugin* o = new OneWirePlugin(ONEWIRE_PIN);
o->loop();

// ...

delete o;

(在您的代码中,切片发生,如评论部分中的Mat所示)

然后,考虑使用智能指针(如unique_ptrshared_ptr).


如果您使用的是C++ 11,还应该loop使用override子类中的说明符进行标记:

class OneWirePlugin : public Plugin {

// ...

void loop() override { 

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有