Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从继承的类访问默认声明的内容_C++_Arduino - Fatal编程技术网

C++ 从继承的类访问默认声明的内容

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

我试图使继承的类访问self类的默认内容。 代码如下(注意声明的数组在父类和子类之间的大小不同)

#包括
甲级{
公众:
整数[2]={1,2};
A(){};

void show(){std::cout
A::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
    a
    vector
    ,并分别使用derived类使用适当的值初始化它。我喜欢你的方法,但我没有提到我想要这样的对象数组:
    A objects[]={A(),B()};objects[0]。show();objects[1]。show();
    。因为我使用的是数组,所以
    show()
    函数返回超类编号,有什么解决方案吗?@RicardoReis请描述您的设计目的或描述您希望帮助设计的内容。您所说的使其成为“XY问题”-比如。@TedLyngmo我想创建一个对象数组,这样就可以很容易地更改大小。在代码的其他部分,我可以简单地执行数组的循环并执行任何需要的操作。创建子类的目的是因为我有不同的“数字”和大小。例如,假设一辆车有一个超类,它有两个名为“auto”的子类而“moto”,auto有
    int-wheels[4]={…}
    和moto
    int-wheels[2]={…}
    @RicardoReis在你的问题中做了澄清,这样每个试图回答的人都能得到相同的信息。
    class B {
    
       // ...
    
       int *get_number() override
       {
            return number;
       }
    };