0

我正在编写一些 Arduino 代码并尝试在某些类中使用继承。我有一个类“Actor”(我的基类)和一个类“Marble”(继承自 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

演员.cpp:

#include "Arduino.h"
#include "Actor.h"

Actor::Actor()
{
}

void Actor::speak() {
  Serial.println("Actor"); 
}

大理石.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

所以。似乎当我创建我的“Actor”数组并尝试将 Marble 粘贴在其中时,它会被投射到一个 Actor 或类似的东西上。问题是,我将有几个不同的字符,它们都将继承自“Actor”,我想要一个它们的数组来迭代并在它们上调用覆盖的方法。

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

谢谢你的帮助,凯文

4

2 回答 2

4

您需要在类中声明as speak,而不仅仅是在类中;没有它,它是一个虚拟函数,所以你总是会被优先于 virtual 调用。virtualActorMarbleActor::speakMarble::speak

对于它的价值,这与 Arduino 无关:这只是一个直接的 C++ 问题。

于 2013-02-14T20:10:18.373 回答
0

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

为了让它按照您想要的方式工作,您需要复制指向对象的指针或引用,而不是对象本身。也就是说,你想要类似 `Actor* children[2]' 的东西:

Marble marble;
Actor* children[2];
children[0] = &marble;

children[0]->speak();

当然,如果children范围超出loop,这将完全失败,您需要使用它new来创建弹珠。

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

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

于 2013-02-14T20:46:42.493 回答