C++如何避免dynamic_casting
C++ How to avoid dynamic_casting?
我对dynamic_casting做了一些研究,我读到它创建了一个名为RTTI的东西,其在启动时也加载在RAM中。在某些平台上,我认为这也不受支持。所以我想知道是否有什么好的解决方案可以避免它
假设我有Statement类
class Statement
{
std::list<Operand*> operands;
};
操作数是一个有更多子类的类,如内存地址、寄存器等。(对于一些好奇的人来说,我正在尝试制作一个汇编程序。):P
我不能使用dynamic_cast进行下转换,如果可以的话,这也很糟糕。但是,如果我向Operand添加了一个枚举,它定义了它的类型,这样我就可以通过使用它的类型使用static_cast进行下转换了。
我可以把它作为const,并在每个子类的构造函数中定义它,对吗?
我期待你们的想法。
Christian
生成类型-是一个选项。
但是考虑为Operand
制作一个通用的interface
。因此,您的memory address
、register
等将实现该接口,并且您将能够对它们进行多态处理。
如果你不能发明这样的interface
,可以考虑重新设计你的类,因为看起来它们不需要有一个公共接口。
如果您需要代码重用,请使用composition
,而不是inheritance
如果您决定向下转换,您可以考虑使用接口来获得适当的类型。但是,您也可以显式地列出子类。
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; }
//...
};
相关文章:
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Casting a const void*
- "The ordinal 344 could not be located in the dynamic link library"
- "Windows doesn't support proper dynamic linking?"是什么意思
- Casting from (long)double to size_t
- 当从此到子类中的新对象时,将显示警告"destination for this 'memcpy' call is a pointer to dynamic class..."
- Casting boost::fusion::vector
- 使用Dynamic Lib使用全局新和删除
- Dynamic vector using Struct
- Qt QObject dynamic array
- C++ 具有"dynamic"体的 lambda 表达式
- C++ std::map vs dynamic array
- 在win2k3上运行.exe时发生"The procedure entry point GetErrorMode could not be located in the dynamic link l
- 使用Qt的国际化,则翻译"dynamic"内容
- 创建新的"dynamic"对象?