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