Arduino代码中的继承

Inheritance in Arduino Code

本文关键字:继承 代码 Arduino      更新时间:2023-10-16

我正在编写一些Arduino代码,并试图在一些类中使用继承。我有一个类"Actor"(我的基类)和一个类(继承自Actor)。以下是头文件:

Actor.h:

#ifndef Actor_h
#define Actor_h
#include "Arduino.h"
class Actor
{
  public:
    Actor();
    void speak();
  private:
};
#endif

大理石.h:

#ifndef Marble_h
#define Marble_h
#include "Arduino.h"
#include "Actor.h"
class Marble : public Actor {
  public:
    Marble();
    virtual void speak();    
  private:
};
#endif

Actor.cpp:

#include "Arduino.h"
#include "Actor.h"
Actor::Actor()
{
}
void Actor::speak() {
  Serial.println("Actor"); 
}

Marble.cpp:

#include "Arduino.h"
#include "Marble.h"
void Marble::speak() {
  Serial.println("Marble"); 
}

最后,我做的循环函数:

void loop() {
  Marble marble;
  Actor children[2];
  children[0] = marble;
  children[0].speak();

这导致"演员"被打印出来。

我发现了这个很好的链接,它似乎与我的问题相似,但解决方案似乎对我不起作用:http://arduino.cc/forum/index.php?topic=41884.0

所以。似乎当我创建我的"演员"阵列,并尝试将Marble插入其中时,它会被选为演员,或者类似的角色。问题是,我将有几个不同的字符,它们都将继承自"Actor",我希望它们的数组能够迭代并调用它们上的重写方法。

所以,也许问题是我如何处理这个问题,或者可能有一些语法错误?我不知道!

谢谢你的帮助,Kevin

您需要在Actor类中将speak声明为virtual,而不仅仅是在Marble类中;如果没有这一点,Actor::speak是一个-虚拟函数,因此您将始终优先于虚拟Marble::speak进行调用。

就其价值而言,这与Arduino无关:它只是一个直接的C++问题。

您的问题是childrenActor类型的数组。行children[0] = marble获取一个Marble对象,将其转换为Actor对象,并将结果复制到children[0]。由于对children[0].speak()的调用是在Actor上进行的,因此您将获得Actor版本。

为了按照您想要的方式工作,您需要复制一个指向对象的指针或引用,而不是对象本身。也就是说,你想要像"演员*儿童[2]"这样的东西:

Marble marble;
Actor* children[2];
children[0] = &marble;
children[0]->speak();

当然,如果children的作用域在loop之外,这将完全失败,您需要使用new来创建弹珠。

更好的是,假设Arduino有STL,您应该使用vectorshared_ptr或类似的东西。

[更新]正如Philip所指出的,这还需要将Actor中的speak方法声明为虚拟方法。