C++ 从继承的类访问默认声明的内容
我试图使继承的类访问self类的默认内容。 代码如下(注意声明的数组在父类和子类之间的大小不同)C++ 从继承的类访问默认声明的内容,c++,arduino,C++,Arduino,我试图使继承的类访问self类的默认内容。 代码如下(注意声明的数组在父类和子类之间的大小不同) #包括 甲级{ 公众: 整数[2]={1,2}; A(){}; void show(){std::coutA::number和B::number是两个完全独立的类成员,它们彼此无关 A::show()只知道A的成员,只知道A::number。它对B一无所知,即使它是B实例的超类 你的C++教科书将解释什么是虚拟函数,以及如何使用它们。最简单的解决方案是在 A中添加虚拟方法,我们称之为代码> GETX
#包括
甲级{
公众:
整数[2]={1,2};
A(){};
void show(){std::coutA::number
和B::number
是两个完全独立的类成员,它们彼此无关
A::show()
只知道A
的成员,只知道A::number
。它对B
一无所知,即使它是B
实例的超类
<>你的C++教科书将解释什么是虚拟函数,以及如何使用它们。最简单的解决方案是在<代码> A<代码>中添加<代码>虚拟<代码>方法,我们称之为代码> GETX编号< /C> >,返回<代码> int */COD>,并且<代码> GETX号< /C>函数简单地返回<代码>编号 >:
class A {
// ...
virtual int *get_number()
{
return number;
}
};
在B
中,虚拟函数被重写,并返回指向其自身类的编号的指针
class B {
// ...
int *get_number() override
{
return number;
}
};
然后,您的show()
方法调用get\u number()获取指向适当数组的指针。参见C++教科书,对虚拟类方法进行完整的讨论。您正在体验名称隐藏-在内部范围内的名称在外部范围内隐藏相同的符号名称。在您的情况下,代码> B::编号< /代码>隐藏代码> A::编号< /C> > /P>
class B {
// ...
int *get_number() override
{
return number;
}
};
C++不支持“虚拟”成员变量,因此您不能重新定义number
。如果确实只有一个数组,我的建议是不要使用继承。因为这样B
就不是真正的A
或者至少可以将A
类泛化为包含任意长数组。有多种方法可以实现这一点:
std::vector
A::number
具有构造函数的成员A(std::size\u t n)
接受大小
使用表示大小的template
参数制作A
类模板,然后可以使用std::array number;
成员变量
将数组传递给基类以获得所有权
另一个选项是将show
设置为虚拟,并在派生类中使用自定义打印覆盖它,但是仍然会留下两个数组,这是一个明显的设计缺陷。是一个使用a::number
数组的B
对象吗?如果不是,则改为使用number
avector
,并分别使用derived类使用适当的值初始化它。我喜欢你的方法,但我没有提到我想要这样的对象数组:A objects[]={A(),B()};objects[0]。show();objects[1]。show();
。因为我使用的是数组,所以show()
函数返回超类编号,有什么解决方案吗?@RicardoReis请描述您的设计目的或描述您希望帮助设计的内容。您所说的使其成为“XY问题”-比如。@TedLyngmo我想创建一个对象数组,这样就可以很容易地更改大小。在代码的其他部分,我可以简单地执行数组的循环并执行任何需要的操作。创建子类的目的是因为我有不同的“数字”和大小。例如,假设一辆车有一个超类,它有两个名为“auto”的子类而“moto”,auto有int-wheels[4]={…}
和motoint-wheels[2]={…}
@RicardoReis在你的问题中做了澄清,这样每个试图回答的人都能得到相同的信息。
class B {
// ...
int *get_number() override
{
return number;
}
};