我试图让继承的类访问self-class默认内容。代码如下(注意声明的数组在父类和子类之间的大小不同(
#include <iostream>
class A {
public:
int number[2] = {1,2};
A(){};
void show() {std::cout << "Number: " << number[0] << ", " << number[1] << "n"; };
};
class B : public A {
public:
int number[3] = {5,6,7};
B() {};
// With this code below it works but I don't want to code the same function on every child class
//void show() {std::cout << "Number: " << number[0] << ", " << number[1] << "n"; };
};
int main() {
A obj_a;
obj_a.show();
B obj_b;
obj_b.show();
}
哪个输出:
Number: 1, 2
Number: 1, 2
预期输出应为:
Number: 1, 2
Number: 5, 6
有人能帮忙吗?
注意:该代码应该在arduino上使用,我使用std::cout只是为了与您共享。
编辑:我想制作一个对象数组,这样它就可以很容易地改变大小,在代码的其他部分,我可以简单地为数组的循环做任何需要的事情。子类的目的也是因为我有不同的";数字";以及他的尺码。例如,假设一个车辆是超级类,它有两个名为"超级"的子类;自动;以及";moto";,auto具有int wheels[4] = {...}
和motoint wheels[2] = {...}
A::number
和B::number
是两个完全独立的类成员,彼此无关。
A::show()
只知道A
的成员,并且只知道A::number
。它对B
一无所知,即使它是B
实例的超类。
你的C++教材将解释什么是虚拟函数,以及如何使用它们。最简单的解决方案是在A
中添加一个virtual
方法,我们称之为get_number
,它返回int *
,而get_number
函数只返回number
:
class A {
// ...
virtual int *get_number()
{
return number;
}
};
在B
中,虚拟函数被覆盖,它返回一个指向自己类的number
的指针。
class B {
// ...
int *get_number() override
{
return number;
}
};
然后,您的show()
方法调用get_number()
以获得指向适当数组的指针。有关虚拟课堂方法的完整讨论,请参阅您的C++教材。
您正在经历名称隐藏-内部作用域中的名称会在外部作用域中隐藏相同的符号名称。在您的情况下,B::number
隐藏A::number
。
C++不支持";虚拟的";成员变量,因此不能重新定义number
。我的建议是,如果确实应该只有一个数组,就不要使用继承。因为CCD_ 23实际上不是CCD_ 24。
或者,至少可以将A
类泛化为包含任意长的数组。有多种方法可以做到这一点:
std::vector
A::number
成员,构造函数A(std::size_t n)
接受该大小- 使
A
成为一个类模板,其中template<std::size_t N>
参数表示大小,然后可以使用std::array<int,N> number;
成员变量 - 将数组传递给基类以获得所有权
另一个选项是使show
成为虚拟的,并在派生类中使用自定义打印覆盖它,但之后仍然会留下两个数组,这是一个明显的设计缺陷。