首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino代码中的继承

Arduino代码中的继承
EN

Stack Overflow用户
提问于 2013-02-15 04:07:05
回答 2查看 10.9K关注 0票数 0

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

Actor.h:

代码语言:javascript
复制
#ifndef Actor_h
#define Actor_h

#include "Arduino.h"

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

Marble.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#include "Arduino.h"
#include "Actor.h"

Actor::Actor()
{
}

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

Marble.cpp:

代码语言:javascript
复制
#include "Arduino.h"
#include "Marble.h"

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

最后,在循环函数中,我这样做:

代码语言:javascript
复制
void loop() {
  Marble marble;
  Actor children[2];
  children[0] = marble;

  children[0].speak();

这会导致“演员”被打印出来。

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

所以。似乎当我创建我的"Actors“数组并尝试将Marble放在其中时,它会被强制转换为一个Actor,或者类似的东西。问题是,我将有几个不同的字符都将从"Actor“继承,我希望它们的数组迭代并调用它们的覆盖方法。

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

谢谢你的帮助,凯文

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 04:10:18

您需要在Actor类中将speak声明为virtual,而不仅仅是在Marble类中;否则,Actor::speak将是一个非虚拟函数,因此您将始终优先于虚拟Marble::speak被调用。

无论它的价值是什么,这与阿杜伊诺无关:这只是一个直接的C++问题。

票数 4
EN

Stack Overflow用户

发布于 2013-02-15 04:46:42

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

为了让它以您想要的方式工作,您需要复制指向对象的指针或引用,而不是复制对象本身。也就是说,你想要像‘`Actor* children2 2’这样的东西:

代码语言:javascript
复制
Marble marble;
Actor* children[2];
children[0] = &marble;

children[0]->speak();

当然,如果childrenloop之外有作用域,这将彻底失败,您将需要使用new来创建您的弹珠。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14883128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档