指向不同派生的指针数组 类
Array of Pointers to Different Derived Classes
我正在研究基于 ATMEGA328P 的微处理器单元系列的核心。我有一个基础 class 和两个派生的 classes,我需要将它们混合存储在一个数组中。我有以下内容:
// 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();
我得到了该方法的基本 class 实现,而不是派生实现。我读过一些关于这个的内容,看来这是由对象切片将它们蒸馏到基数 class 引起的。还有另一种方法可以解决这个问题吗?我无权访问此平台上的智能指针或向量(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);
您正在维护一个频道对象数组。
要使虚函数起作用,您需要维护基 class 类型的指针或引用。
Channel *Channels;
创建一个通道对象数组。您需要为通道对象创建一个 pointer/reference 数组,即
Channel **Channels;
相应地更改程序以使用指针而不是通道类型的对象。
我正在研究基于 ATMEGA328P 的微处理器单元系列的核心。我有一个基础 class 和两个派生的 classes,我需要将它们混合存储在一个数组中。我有以下内容:
// 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();
我得到了该方法的基本 class 实现,而不是派生实现。我读过一些关于这个的内容,看来这是由对象切片将它们蒸馏到基数 class 引起的。还有另一种方法可以解决这个问题吗?我无权访问此平台上的智能指针或向量(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);
您正在维护一个频道对象数组。
要使虚函数起作用,您需要维护基 class 类型的指针或引用。
Channel *Channels;
创建一个通道对象数组。您需要为通道对象创建一个 pointer/reference 数组,即
Channel **Channels;
相应地更改程序以使用指针而不是通道类型的对象。