首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++如何避免dynamic_casting?

C++如何避免dynamic_casting?
EN

Stack Overflow用户
提问于 2012-07-26 15:41:18
回答 2查看 882关注 0票数 0

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

假设我有一个语句类

代码语言:javascript
复制
class Statement
{
    std::list<Operand*> operands;
};

操作数是具有更多子类的类,如内存地址、寄存器等。(对于一些好奇的人,我正在试着做一个汇编程序。

我不能和dynamic_cast一起去下投,如果我可以的话,这也是不好的。但是如果我向操作数添加一个枚举,它定义了它的类型,这样我就可以通过使用它的类型向下转换static_cast。

我可以让它成为const,并在每个子类的构造函数中定义它,对吧?

我期待着你们所有人的想法。

克里斯蒂安

EN

回答 2

Stack Overflow用户

发布于 2012-07-26 15:44:06

创建一个类型-是一种选择。

但是可以考虑为Operand创建一个通用的interface。因此,您memory addressregister等将实现该接口,您将能够将它们视为多态的。

如果你不能发明这样的interface -考虑重新设计你的类,因为它们看起来不需要有一个公共接口。

如果您需要代码重用,请使用composition,而不是inheritance

票数 2
EN

Stack Overflow用户

发布于 2012-07-26 16:56:42

如果你决定向下转换,你可以考虑使用一个接口来获得合适的类型。但是,您也可以显式地列出子类。

代码语言:javascript
复制
class Operand {
public:
    enum Type { OT_Address, OT_Register, /*...*/ };
    virtual Type type () const = 0;
    virtual AddressOperand * isAddress () { return 0; }
    virtual RegisterOperand * isRegister () { return 0; }
    //...
};

然后,您可以简单地调用与该类型相关联的方法,而不是向下转换。派生类将实现它:

代码语言:javascript
复制
class AddressOperand : public Operand {
public:
    Operand::Type type () const { return Operand::OT_Address; }
    AddressOperand * isAddress () { return this; }
    //...
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11664597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档