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

C++ 指向不同派生类的指针数组,c++,inheritance,object-slicing,C++,Inheritance,Object Slicing,我正在为一系列基于ATMEGA328P的微处理器单元开发核心。我需要将一个基类和两个派生类混合存储在一个数组中。我有以下资料: // base class class Channel { virtual String ReturnValuesAsString(); virtual void ResetValues(); ... } // derived class class DigitalChannel : Channel { String ReturnValuesA

我正在为一系列基于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];
      }
   }
}
input0.Channels[0].ReturnValuesAsString();
在我的另一个对象上,我有以下内容:

// 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];
      }
   }
}
input0.Channels[0].ReturnValuesAsString();
我按如下方式初始化输入:

DigitalChannel digitalChannel00 = DigitalChannel();
DigitalChannel digitalChannel01 = DigitalChannel();

Channel *digitalInputChannelsInput0[] = { &digitalChannel00, &digitalChannel01 };

Input input0 = Input(2, digitalInputChannelsInput0);
DigitalChannel digitalChannel00 = DigitalChannel();
DigitalChannel digitalChannel01 = DigitalChannel();

Channel *digitalInputChannelsInput0[] = { &digitalChannel00, &digitalChannel01 };

Input input0 = Input(2, digitalInputChannelsInput0);
我的问题是,当我引用与以下类似的任何通道时:

// 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];
      }
   }
}
input0.Channels[0].ReturnValuesAsString();
我得到的是该方法的基类实现,而不是派生实现。我读过一些关于这方面的文章,似乎这是由对象切片将它们提取到基类引起的。我还有别的办法处理吗?我无法在这个平台上访问智能指针或向量(arduino是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 = DigitalChannel();

Channel *digitalInputChannelsInput0[] = { &digitalChannel00, &digitalChannel01 };

Input input0 = Input(2, digitalInputChannelsInput0);
DigitalChannel digitalChannel00 = DigitalChannel();
DigitalChannel digitalChannel01 = DigitalChannel();

Channel *digitalInputChannelsInput0[] = { &digitalChannel00, &digitalChannel01 };

Input input0 = Input(2, digitalInputChannelsInput0);

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

Channel *Channels;
创建通道OBEJCT的数组。您需要创建指向通道对象的指针/引用数组,即

Channel **Channels;

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

然后我是否会使用
input0.Channels[0]->ReturnValuesAsString()指针数组修复后,从那时起?@PhillipMcMullen是。这就是使用指向对象的指针访问成员的方式。