C++如何避免dynamic_casting

C++ How to avoid dynamic_casting?

本文关键字:casting dynamic 何避免 C++      更新时间:2023-10-16

我对dynamic_casting做了一些研究,我读到它创建了一个名为RTTI的东西,其在启动时也加载在RAM中。在某些平台上,我认为这也不受支持。所以我想知道是否有什么好的解决方案可以避免它

假设我有Statement类

class Statement
{
    std::list<Operand*> operands;
};

操作数是一个有更多子类的类,如内存地址、寄存器等。(对于一些好奇的人来说,我正在尝试制作一个汇编程序。):P

我不能使用dynamic_cast进行下转换,如果可以的话,这也很糟糕。但是,如果我向Operand添加了一个枚举,它定义了它的类型,这样我就可以通过使用它的类型使用static_cast进行下转换了。

我可以把它作为const,并在每个子类的构造函数中定义它,对吗?

我期待你们的想法。

Christian

生成类型-是一个选项。

但是考虑为Operand制作一个通用的interface。因此,您的memory addressregister等将实现该接口,并且您将能够对它们进行多态处理。

如果你不能发明这样的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; }
    //...
};