一种方法是为基类中的通信类型定义一个抽象函数。然后在你的派生类中实现这个函数。这使您可以处理所需的每种类型的通信。
但是通过两种方式引用,您必须更加谨慎地删除此类对象。这种类型的架构非常容易出错。
对于通信的两种方式引用可能如下所示:base.h:
class Base {
void doCommunication(Base *caller) = 0;
};
库存.h:
class Inventory; // forward declaration for Item class
#include "Item.h"
class Inventory : public Base {
void doCommunication(Base *commCaller) {
// check type
Inventory *invCaller = dynamic_class<Inventory*> (commCaller);
if(invCaller != nullptr) {
// called from inventory and you are able to use inventory
return; // you can stop here cause commCaller can only be Base class instead but not Item
}
Item *itemCaller = dynamic_class<Inventory*> (commCaller);
if(invCaller != nullptr) {
// called from item and you are able to use item
return; // you can stop here cause commCaller can only be Base class instead but not inventory
}
}
};
Item.h 看起来与库存类非常相似,doCommunications 必须为项目特定功能覆盖。
我还不能测试代码,但它应该可以工作。dynamic_cast 的原因,您可以转换为您需要的目标对象并调用所需的函数。如果失败,你会得到一个 nullptr。
希望能帮助到你。
欢呼卢卡斯