我正在编写一些Arduino代码,并尝试在一些类中使用继承。我有一个类"Actor“(我的基类)和一个"Marble”类(继承自Actor)。以下是头文件:
Actor.h:
#ifndef Actor_h
#define Actor_h
#include "Arduino.h"
class Actor
{
public:
Actor();
void speak();
private:
};
#endifMarble.h:
#ifndef Marble_h
#define Marble_h
#include "Arduino.h"
#include "Actor.h"
class Marble : public Actor {
public:
Marble();
virtual void speak();
private:
};
#endifActor.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
所以。似乎当我创建我的"Actors“数组并尝试将Marble放在其中时,它会被强制转换为一个Actor,或者类似的东西。问题是,我将有几个不同的字符都将从"Actor“继承,我希望它们的数组迭代并调用它们的覆盖方法。
所以,问题可能是我是如何处理这个问题的,或者可能有一些语法错误?我不知道!
谢谢你的帮助,凯文
发布于 2013-02-15 04:10:18
您需要在Actor类中将speak声明为virtual,而不仅仅是在Marble类中;否则,Actor::speak将是一个非虚拟函数,因此您将始终优先于虚拟Marble::speak被调用。
无论它的价值是什么,这与阿杜伊诺无关:这只是一个直接的C++问题。
发布于 2013-02-15 04:46:42
您的问题是children是一个Actor类型的数组。children[0] = marble这一行接受一个Marble对象,将其转换为Actor对象并将结果复制到children[0]。由于对children[0].speak()的调用是在Actor上进行的,因此您将获得Actor版本。
为了让它以您想要的方式工作,您需要复制指向对象的指针或引用,而不是复制对象本身。也就是说,你想要像‘`Actor* children2 2’这样的东西:
Marble marble;
Actor* children[2];
children[0] = &marble;
children[0]->speak();当然,如果children在loop之外有作用域,这将彻底失败,您将需要使用new来创建您的弹珠。
更好的是,假设Arduino有STL,你应该使用vector和shared_ptr或者类似的东西。
更新正如菲利普所指出的,这还需要将Actor中的speak方法声明为虚拟的。
https://stackoverflow.com/questions/14883128
复制相似问题