Arduino代码中的继承
Inheritance in Arduino Code
我正在编写一些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++问题。
您的问题是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,您应该使用vector
和shared_ptr
或类似的东西。
[更新]正如Philip所指出的,这还需要将Actor
中的speak
方法声明为虚拟方法。
- 删除C++继承中虚拟类成员的代码重复
- 删除继承中的代码重复?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 如何编写将要继承的泛型代码?
- 继承、覆盖和虚函数,以避免重复代码
- 继承此C++代码有什么问题
- 多级继承程序代码的输出
- 代码在虚拟函数和继承方面未按预期工作
- 为什么下面的代码不会编译(c++中的继承)
- 为什么这个C++继承代码示例的行为是这样的
- 如何与模板正确重写此使用继承的C 代码
- 如何删除此与继承相关的代码气味
- 不重复代码的继承
- 继承可以用来减少C++中编译代码的大小吗?
- 继承代码出现C++错误(没有匹配的构造函数)
- 将多重继承C++代码移植到 Java
- 类继承代码不起作用
- 为什么clang和gcc在虚拟继承代码上存在分歧?
- C++11 继承代码无法使用 clang 进行编译
- 我如何访问继承代码的不同部分