代码之家  ›  专栏  ›  技术社区  ›  Phillip McMullen

指向不同派生类的指针数组

  •  1
  • Phillip McMullen  · 技术社区  · 6 年前

    我正在为一系列基于atmega328p的微处理器单元开发核心。我有一个基类和两个派生类,需要将它们混合存储在一个数组中。我有以下几点:

    // base class
    class Channel {
       virtual String ReturnValuesAsString();
       virtual void ResetValues();
       ...
    }
    
    // derived class
    class DigitalChannel : Channel {
       String ReturnValuesAsString() override;
       void ResetValues() override;
    }
    
    // derived class
    class AnalogChannel : Channel {
       String ReturnValuesAsString() override;
       void ResetValues() override;
    }
    

    在我的另一个对象上,我有以下内容:

    class Input {
       Channel *Channels; //array of channels
    
       Input(int totalPossibleChannels, Channel *channels[]) {
    
          this->Channels = new Channel[totalPossibleChannels];
    
          // pseudocoded for loop using 'chanIndex' iterator to keep it short on this post
          for channel in channels {
             this->Channels[chanIndex] = *channels[chanIndex];
          }
       }
    }
    

    我初始化输入如下:

    DigitalChannel digitalChannel00 = DigitalChannel();
    DigitalChannel digitalChannel01 = DigitalChannel();
    
    Channel *digitalInputChannelsInput0[] = { &digitalChannel00, &digitalChannel01 };
    
    Input input0 = Input(2, digitalInputChannelsInput0);
    

    我的问题是,当我引用类似于以下内容的任何频道时:

    input0.Channels[0].ReturnValuesAsString();
    

    我得到了该方法的基类实现,而不是派生实现。我读过一些关于这个的文章,看起来这是由对象切片将它们提取到基类引起的。我还有别的办法吗?在这个平台上,我没有访问智能指针或向量(ARDUNO是C++的一个有限的端口)。事先谢谢!我也愿意接受任何建议。

    更新:将此标记为“已解决”,但我想添加更多上下文,以便稍后帮助其他人

    新结构如下:

    class Input {
       Channel **Channels; //array of channel pointers
    
       Input(int totalPossibleChannels, Channel *channels[]) {
    
          this->Channels = new Channel *[totalPossibleChannels];
    
          // pseudocoded for loop using 'chanIndex' iterator to keep it short on this post
          for channel in channels {
             this->Channels[chanIndex] = channels[chanIndex];
          }
       }
    }
    

    我初始化输入如下:

    DigitalChannel DigitalChannel00=DigitalChannel();
    DigitalChannel DigitalChannel01=数字频道();
    
    频道*数字输入频道输入0[]=数字频道00和数字频道01
    
    输入输入0=输入(2,数字输入通道输入0);
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   LearningC    6 年前

    您正在维护一个通道obejct数组。
    要使虚函数工作,您需要维护基类类型的指针或引用。

    Channel *Channels;
    

    创建一个通道obejcts数组。您需要创建一个指向通道对象的指针/引用数组,即

    Channel **Channels;
    

    相应地更改程序以使用指针而不是通道类型的对象。

    推荐文章