访问继承类中默认声明的内容



我试图让继承的类访问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::numberB::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类泛化为包含任意长的数组。有多种方法可以做到这一点:

  1. std::vectorA::number成员,构造函数A(std::size_t n)接受该大小
  2. 使A成为一个类模板,其中template<std::size_t N>参数表示大小,然后可以使用std::array<int,N> number;成员变量
  3. 将数组传递给基类以获得所有权

另一个选项是使show成为虚拟的,并在派生类中使用自定义打印覆盖它,但之后仍然会留下两个数组,这是一个明显的设计缺陷。

最新更新