【问题标题】:How to do inheritance [duplicate]如何进行继承[重复]
【发布时间】:2019-01-12 16:12:56
【问题描述】:

无法理解如何正确继承对象。有我的代码:

#include <ArduinoSTL.h>

class Element {
public:
    Element() {

    };
    virtual void execute() {
        Serial.print("element\n");
    }
};
class ExtendedElement : public Element {
public:
    ExtendedElement() : Element() {

    }
    virtual void execute() {
        Serial.print("extended element\n");
    }
};
class Wrapper {
private:
    std::vector<Element> elements;

public:
    void execute() {
        for (Element element : elements) {
            element.execute();
        }
    }

    void addTask(Element element) {
        elements.push_back(element);
    }
};

Wrapper wrapper;

void setup() {
    Serial.begin(9600);
    ExtendedElement extendedElement = new ExtendedElement();
    wrapper.addTask(extendedElement);
}

void loop() {
    wrapper.execute();
}

所以,我想扩展类,创建这个扩展类的实例,并将这个实例放入基类的向量中。 然后我想遍历向量中的元素,并调用子类函数。无法理解我做错了什么。

【问题讨论】:

  • 当出现问题时,您必须描述什么是错误的?有编译器错误吗?如果是,请在您的问题中显示(复制并粘贴到那里)。代码行为是否错误?然后描述您预期的行为以及您看到的行为。
  • Element的向量只能存储Element类的对象。 ExtendedElement extendedElement = new ExtendedElement(); 也是无效的,因为右边部分会产生一个指针。

标签: arduino


【解决方案1】:

new 的结果应该分配给一个指针

ExtendedElement *extendedElement = new ExtendedElement();

元素应该是一个指针向量

class Wrapper {
private:
    std::vector<Element*> elements;

public:
    void execute() {
        for (Element *element : elements) {
            element->execute();
        }
    }

    void addTask(Element *element) {
        elements.push_back(element);
    }
};

【讨论】:

    【解决方案2】:

    您已经发现了所谓的对象切片。您的向量存储 Element 对象而不是 ExtendedElement 对象。当您将 ExtendedElement 对象添加到您的向量时,它会转换为 Element(这是切片部分),因此您的 ExtendedElement 方法将永远不会被调用。

    要解决这个问题,您需要在向量中存储指向 Element 对象的指针。指向Element 的指针可以指向实际的ExtendedElement 对象,并且使用虚函数可确保调用实际类型的正确函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2012-07-14
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多