C++ 给孩子们打电话';将函数从指针指向父对象

C++ 给孩子们打电话';将函数从指针指向父对象,c++,inheritance,arduino,C++,Inheritance,Arduino,我试图找出如何通过指向父对象的指针访问子对象的函数和成员。 这里是我制作的一个小示例草图,而不是发布真实项目中的100行代码 类B继承自类A。在类C中有一个A的数组。如果对象是B,我想从B获取printVals以调用它。在java中,它会自动从B调用函数,如果我想从B访问非重写函数或成员,我只想这样做:(不是实际的代码) 但是,如果我在C++中正确理解了,在将B变量中的成员变量放入A数组时,它就被省略了,这是有意义的,因为数组中的每个对象都需要具有不知道B的存在的siZeof(a)返回的大小。

我试图找出如何通过指向父对象的指针访问子对象的函数和成员。 这里是我制作的一个小示例草图,而不是发布真实项目中的100行代码

类B继承自类A。在类C中有一个A的数组。如果对象是B,我想从B获取printVals以调用它。在java中,它会自动从B调用函数,如果我想从B访问非重写函数或成员,我只想这样做:(不是实际的代码)

但是,如果我在C++中正确理解了,在将B变量中的成员变量放入A数组时,它就被省略了,这是有意义的,因为数组中的每个对象都需要具有不知道B的存在的siZeof(a)返回的大小。 代码如下:

class A {
  protected:
    int _aMember;
  public:
    A(int a) {
      _aMember = a;
    }
    int geAMember() {
      return _aMember;
    }
    virtual void printVals() {
      Serial.println("a: " + String(_aMember));
    }
};

class B : public A {
  protected:
    int _bMember;
  public:
    B(int a, int b) : A(a) {
      _bMember = b;
    }
    int geBMember() {
      return _bMember;
    }
    void printVals() {
      Serial.println("a: " + String(_aMember) + "  b: " + String(_bMember) );
    }
};

class C {
  private:
    A* _aArr;
    int _nVals;

  public:
    C(A aArr[], int nVals) {
      _aArr = aArr;
      _nVals = nVals;
    }

    void printList() {
      for (int i = 0; i < _nVals; i++) {
        _aArr[i].printVals();
      }
    }
};

void setup() {
  Serial.begin(500000);
  A a(1);
  Serial.print("a: ");
  a.printVals();

  B b1(3, 4);
  Serial.print("b1: ");
  b1.printVals();

  B b2(5, 6);
  Serial.print("b2: ");
  b2.printVals();

  A aList[] = {a, b1, b2};
  C c(aList, 3);

  Serial.println("\nprintList()");
  c.printList();
}

void loop() {}
我想这样做的原因是我正在构建一个菜单系统,通过arduino在一个小显示屏上显示。我有一个类Screen,它具有类似showScreen()的函数;按钮按下();setEncVal(int encVal)。。。。 然后是从屏幕继承的子类,例如类菜单、类值选择器。。。 名为ScreenManager的类管理显示的屏幕,并从上述屏幕调用函数。有一个指针指向显示的屏幕(屏幕*\u shownScreen)。
因为我想拥有多种不同类型的屏幕,我不知道如何解决这个问题切片对象。你想要一个指向
A
的指针数组,正如@UholySheep所指出的,你需要写
A*aList[]={&A,&b1,&b2},但是您将以多态方式使用类B,因此我建议您在父类中添加一个空的虚拟析构函数。非常感谢。我让它工作了。我真的需要一个析构函数吗?我计划在微控制器通电时创建整个菜单结构,并将所有内容保存在内存中,直到关闭。
class A {
  protected:
    int _aMember;
  public:
    A(int a) {
      _aMember = a;
    }
    int geAMember() {
      return _aMember;
    }
    virtual void printVals() {
      Serial.println("a: " + String(_aMember));
    }
};

class B : public A {
  protected:
    int _bMember;
  public:
    B(int a, int b) : A(a) {
      _bMember = b;
    }
    int geBMember() {
      return _bMember;
    }
    void printVals() {
      Serial.println("a: " + String(_aMember) + "  b: " + String(_bMember) );
    }
};

class C {
  private:
    A* _aArr;
    int _nVals;

  public:
    C(A aArr[], int nVals) {
      _aArr = aArr;
      _nVals = nVals;
    }

    void printList() {
      for (int i = 0; i < _nVals; i++) {
        _aArr[i].printVals();
      }
    }
};

void setup() {
  Serial.begin(500000);
  A a(1);
  Serial.print("a: ");
  a.printVals();

  B b1(3, 4);
  Serial.print("b1: ");
  b1.printVals();

  B b2(5, 6);
  Serial.print("b2: ");
  b2.printVals();

  A aList[] = {a, b1, b2};
  C c(aList, 3);

  Serial.println("\nprintList()");
  c.printList();
}

void loop() {}
a: a: 1
b1: a: 3  b: 4
b2: a: 5  b: 6

printList()
a: 1
a: 3
a: 5