我正在使用Visual Studio 2012在CLI / C ++中进行编程。
(作为一句话的总结,我的问题是,在将基类组装到DLL中并在另一个项目中使用和重写时,派生方法未被调用(但基方法被调用)。
我的项目中有Card和CardManager类(基类)和ComplexCard类。以前,我在同一项目中拥有这些基类和复杂类,但是现在我试图将基类分离为一个新项目(项目A),该项目将编译为.net dll。
在卡片班上,我有
virtual void HandleMessage(NativeStruct *, INT32U *);
方法。这个CardManager和Card类在Project A中,该项目以.net DLL构建。
在项目B中,我引用了A.DLL,并从Card类派生了一个名为ComplexCard的类。 (我可以在ComplexCard构造函数中逐步调试并验证是否也调用了基类的Constructor。因此,我认为我成功地从Card类派生了)。我将此类添加到CardManager的列表中。
收到消息后,将在CardManager类中调用card-> HandleMessage()方法。由于CardManager在项目A中,因此card为Card类型。但是由于它是作为ComplexCard创建并添加的,因此它们实际上是ComplexCard。因此,当调用card-> HandleMessage()方法时,我假设将调用ComplexCard的HandleMessage方法,但是每次都会调用基类的HandleMessage方法,而从不调用Complex Class的(多态性)。另外,在调试时,我可以在“监视”字段中确认该卡为ComplexCard类型。
当Base类和Complex类位于同一项目中并且每次调用ComplexCard-> HandleMessage()时,我都在项目中测试了这些代码。
所以,我认为当我将基类转移到另一个DLL项目并在另一个项目中引用它们时,就会发生此问题。我应该怎么做才能看到预期的行为,看到ComplexCard-> HandleMessage()被调用。
Card.h
virtual void HandleMessage(S_MESSAGE *message);
ComplexCard.h
virtual void HandleMessage(S_MESSAGE *message) override;
CardManager.cpp>邮件接收器方法
S_MESSAGE message;
// message is filled
Card ^card = this->GetCard(remote_ip); // Get the card from list
card->HandleMessage(message); // Call the handlemessage method. PROBLEM is here
CardManager.cpp> GetCard方法:
Card ^CardManager::GetCard(String ^value){
// These cards in Cards list are all ComplexClass type, not Base Card type
for each(Card ^card in Cards){
if(value == card->value){
return card;
}
}
return nullptr;
}
我有一个基本的CardFactory和ComplexCardFactory。创建CardManager时,我使用setter方法设置了ComplexCardFactory实例。因此,当CardManager需要卡片时,它将使用ComplexCardFactory。
收到消息后,CardManager会处理消息并从CardFactory获取一张卡。当我在这里进入方法代码时,我看到ComplexCardFactory正在生成ComplexCard并将其返回。返回的Card实例将添加到Cards列表中。
此步骤之后,将调用card-> HandleMessage,但将调用Card-> HandleMessage,而不是ComplexCard-> HandleMessage。
添加新卡的简化代码为:
Card ^ComplexCardFactory::GetCard(String ^value)
{
ComplexCard ^new_card = gcnew ComplexCard(value);
return new_card;
}
//and then. Verified that ComplexCardFactory is producing the card and its type is ComplexCard.
Cards->Add(new_card);