在类中定义成员,但直到运行时才知道实际类型

Pet*_*217 1 c++ polymorphism inheritance

这可能是普通C++用户的基本问题.在功能上,我有一个ECG监视器,并希望选择在运行时使用哪种输出格式.我已经设置了两个暴露相同方法和成员的类(例如,ECGRecordingDefaultFormat和ECGRecordingEDFFormat). - > InsertMeasure, - > setFrequency, - > setPatientName等.

我知道我可以定义每个格式类类型的一个实例,然后输入:

if (ECGFormatToUse == ECGFormat.EDF) {
    ecgDefaultFormat.InsertMeasure(x);
}
if (ECGFormatToUse == ECGFormat.Default) {
    ecgEDFFormat.InsertMeasure(x);
}
Run Code Online (Sandbox Code Playgroud)

整个代码都是如此,但我想我可能不会完全使用C++的动态类型.

问题是:我可以在main()中定义一个变量,并在运行时选择我想要的格式后,让代码使用正确的类及其公开的'InsertMeasure'方法,避免在整个过程中使用大量的if/else码?

我很高兴只能参考我应该使用的继承/多态(?)的哪个方面,并且可以将其余部分谷歌.

多谢你们.

皮特

Luc*_*ore 6

您可以将工厂模式与C++的多态性结合起来.

class Base
{
   virtual void InsertMeasure() = 0; //virtual pure, make the base class abstract
};

class ECGRecordingDefaultFormat : public Base
{
   virtual void InsertMeasure();
};

class ECGRecordingEDFFormat : public Base
{
   virtual void InsertMeasure();
};

class Factory
{
   static Base* create(ECGFormat format)
   {
      if ( format == ECGFormat.EDF )
         return new ECGRecordingEDFFormat;
      if ( format == ECGFormat.Default )
         return new ECGRecordingDefaultFormat;
      return NULL;
   }
};

int main()
{
   ECGFormat format;
   //set the format
   Base* ECGRecordingInstance = Factory::create(format);
   ECGRecordingInstance->InsertMeasure();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)