实例化一个子类作为父类,但调用孩子的方法

问题描述:

我正在编写一个应用程序,它需要开发一个引擎来处理数据,但引擎必须由另一个根据客户的需要来替换。由于每个客户都有非常不同的需求,我希望将每个引擎与其他引擎分开,因此我们只能使用客户需要的引擎交付应用程序。实例化一个子类作为父类,但调用孩子的方法

所以我的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 

我意识到这与继承有关,但我对如何解决这个问题的想法不太了解。

有没有人有如何解决这个问题的想法?

我们的方法是一个正确的解决方案,还是我们应该一直在寻找其他方法并以不同的方式做事?

+0

我不能在C++中重现此问题。我用虚拟方法创建了一个抽象基类,还创建了两个派生类。然后,我可以实例化派生类,并使用与用于执行指向虚方法基础的委托相同的语法。 您可以发布Engine_Base,Engine_A和Engine_B定义的相关部分吗? – 2009-05-22 21:55:31

+0

这是托管C++并将函数标记为虚拟并没有任何行为影响。将基类标记为虚拟会导致以下错误: 错误错误C2889:'Engine_Base':托管类类型不能是虚拟基类 – 2009-05-26 15:51:29

编辑:也许请确保Engine_A等方法标记为虚拟?