继承在Arduino的代码(Inheritance in Arduino Code)

2019-08-16 23:44发布

我正在写一些代码Arduino的,并试图在某些类使用继承。 我有一个类“演员”(我的基类)和类“大理石”(从演员继承)。 这里是头文件:

Actor.h:

#ifndef Actor_h
#define Actor_h

#include "Arduino.h"

class Actor
{
  public:
    Actor();
    void speak();
  private:
};
#endif

Marble.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

所以。 看来,当我创建我的“演员”的阵列和尝试,并坚持大理石在那里它被强制转换为演员,或者类似的东西等。 问题是,我有一些不同的角色,将全部由“演员”继承,我想他们的数组迭代,并呼吁它们覆盖的方法。

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

感谢您的帮助,凯文·

Answer 1:

需要声明speak作为virtualActor类,不只是在Marble类; 不说, Actor::speak是一种 -虚拟功能,所以你将永远优先于虚拟被称为Marble::speak

对于它的价值,这有什么好做的Arduino的:它只是一个单纯的C ++的问题。



Answer 2:

你的问题是, children是类型的数组Actor 。 行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或类似的东西。

[更新]菲利普指出,这也要求speak的方法Actor被声明为虚。



文章来源: Inheritance in Arduino Code