我对dynamic_casting做了一些研究,我读到它创建了一个叫做RTTI的东西,它也在启动时加载到内存中。在一些平台上,我认为这也不受支持。所以我想知道是否有什么好的解决方案来避免它。
假设我有一个语句类
class Statement
{
std::list<Operand*> operands;
};操作数是具有更多子类的类,如内存地址、寄存器等。(对于一些好奇的人,我正在试着做一个汇编程序。
我不能和dynamic_cast一起去下投,如果我可以的话,这也是不好的。但是如果我向操作数添加一个枚举,它定义了它的类型,这样我就可以通过使用它的类型向下转换static_cast。
我可以让它成为const,并在每个子类的构造函数中定义它,对吧?
我期待着你们所有人的想法。
克里斯蒂安
发布于 2012-07-26 15:44:06
创建一个类型-是一种选择。
但是可以考虑为Operand创建一个通用的interface。因此,您memory address、register等将实现该接口,您将能够将它们视为多态的。
如果你不能发明这样的interface -考虑重新设计你的类,因为它们看起来不需要有一个公共接口。
如果您需要代码重用,请使用composition,而不是inheritance
发布于 2012-07-26 16:56:42
如果你决定向下转换,你可以考虑使用一个接口来获得合适的类型。但是,您也可以显式地列出子类。
class Operand {
public:
enum Type { OT_Address, OT_Register, /*...*/ };
virtual Type type () const = 0;
virtual AddressOperand * isAddress () { return 0; }
virtual RegisterOperand * isRegister () { return 0; }
//...
};然后,您可以简单地调用与该类型相关联的方法,而不是向下转换。派生类将实现它:
class AddressOperand : public Operand {
public:
Operand::Type type () const { return Operand::OT_Address; }
AddressOperand * isAddress () { return this; }
//...
};https://stackoverflow.com/questions/11664597
复制相似问题