我正在尝试创建一些仅包含数据成员(无函数)的类,但我希望它们是多态的 - 我的意思是我将通过指向基类的指针传递对象,并且我需要能够dynamic_cast
它们到特定的派生类型(NULL
如果实例不是给定类型,则结果值为。)
例如,我有一个项目:
struct Item {
int x, y;
}
我还有一个可以移动的项目,以及另一个包含文本的项目:
struct MovingItem: virtual public Item {
int speedX, speedY;
}
struct TextItem: virtual public Item {
std::string text;
}
大概我必须使用上面的虚拟继承,因为我还想要一个可以移动并具有文本的项目,但我只想要来自顶层的一组坐标Item
:
struct MovingTextItem: virtual public MovingItem, virtual public TextItem {
}
这些都可以正确定义,但是当我尝试查看它dynamic_cast
是Item *
什么类型时,我的编译器抱怨源类型不是多态的。
void example(Item *i) {
MovingTextItem *mti = dynamic_cast<MovingTextItem *>(i); // error!
}
如果我使用虚函数而不是数据成员重新实现整个事情,这将起作用,但这似乎是一种浪费,因为我不需要覆盖任何东西。
我能想到的唯一解决方法是向type
基类添加一个成员Item
,并检查它而不是 using dynamic_cast
,如果它的类型正确,则使用它static_cast
。(缺点是我必须知道某处的所有对象类型,因此分配的type
值不会冲突。)
这是最好的解决方案,还是有其他方法?
澄清
为了参数,假设我正在将每个对象类型写入文件。 MovingItem
转到一个文件,TextItem
转到另一个文件,然后MovingTextItem
转到两个文件。所以拥有一个实现每个接口的基类是行不通的,除非我能以某种方式告诉哪些接口正在使用,以便将它们写入正确的文件。