实例化一个子类作为父类,但调用孩子的方法
问题描述:
我正在编写一个应用程序,它需要开发一个引擎来处理数据,但引擎必须由另一个根据客户的需要来替换。由于每个客户都有非常不同的需求,我希望将每个引擎与其他引擎分开,因此我们只能使用客户需要的引擎交付应用程序。实例化一个子类作为父类,但调用孩子的方法
所以我的VS解决方案具有以下项目:应用程序,Engine_Base,Engine_A,Engine_B 应用程序= exe文件 Engine_Base =父类...编译为一个dll,并通过工程中的添加到应用程序的引用属性 Engine_A和Engine_B都是Engine_Base的子类,并且都编译为自己的dll(Engine_A.dll,Engine_B.dll)。它们不会被添加到App的引用中,因此它们不会在运行时加载,因为我们不想将它们都发送给所有客户。
基于我们决定哪些发动机负荷客户的配置文件:
Engine_Base^ engine_for_app;
Assembly^ SampleAssembly;
Type^ engineType;
if (this->M_ENGINE == "A")
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_A.dll");
engineType = SampleAssembly->GetType("Engine_A");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2));
}
else
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_B.dll");
engineType = SampleAssembly->GetType("Engine_B");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2, param3, param4));
}
由于只有Engine_Base被添加到C++项目的引用我们投我们的Engine__A或Engine_B对象的父类型。
然后我们设置的活动为我们的发动机的线程执行,因为他们需要很长的时间来运行(大量的数据要处理):
engine_for_app->OnComplete += gcnew CompleteEngineProcess(this, &frmMain::ThreadChildComplete);
engine_for_app->OnProgressInit += gcnew ProgressInitEngine(this, &frmMain::ThreadChildProgressInit);
engine_for_app->OnProgressReport += gcnew ProgressReportEngine(this, &frmMain::ThreadChildProgressReport);
Thread^ aThread;
aThread = gcnew Thread(gcnew ThreadStart(engine_for_app, &Engine_Base::Read));
但是,这给了我一个:
Error 2 error C3754: delegate constructor: member function 'Engine_A::Read' cannot be called on an instance of type 'Engine_Base ^' d:\_activeWork\EDI_TRUNK\src\App\frmMain.cpp 492
我意识到这与继承有关,但我对如何解决这个问题的想法不太了解。
有没有人有如何解决这个问题的想法?
我们的方法是一个正确的解决方案,还是我们应该一直在寻找其他方法并以不同的方式做事?
答
编辑:也许请确保Engine_A等方法标记为虚拟?
我不能在C++中重现此问题。我用虚拟方法创建了一个抽象基类,还创建了两个派生类。然后,我可以实例化派生类,并使用与用于执行指向虚方法基础的委托相同的语法。 您可以发布Engine_Base,Engine_A和Engine_B定义的相关部分吗? – 2009-05-22 21:55:31
这是托管C++并将函数标记为虚拟并没有任何行为影响。将基类标记为虚拟会导致以下错误: 错误错误C2889:'Engine_Base':托管类类型不能是虚拟基类 – 2009-05-26 15:51:29