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