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

时间:2018-07-20 16:16:40

标签: c++ inheritance object-slicing

我正在为基于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();

我获得了该方法的基类实现,而不是派生的实现。我已经读了一些关于它的内容,看来这是由于对象切片将它们提炼成基类而引起的。我还有其他方法可以解决这个问题吗?我无法在此平台上访问智能指针或向量(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);

1 个答案:

答案 0 :(得分:1)

您正在维护一系列通道对象。
为了使虚拟函数正常工作,您需要维护基类类型的指针或引用。

Channel *Channels;

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

Channel **Channels;

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