C++ 强制转换和 typeid

Posted

技术标签:

【中文标题】C++ 强制转换和 typeid【英文标题】:C++ casting and typeid 【发布时间】:2013-08-05 19:10:33 【问题描述】:

我有一个有两个基类指针的函数,根据子类,应该调用其他函数...

像这样:

    void function(A* a, A* a2)

    if (typeid(*a).name() == "B")
        if(typeid(*a2).name() == "C")
            otherFunction(); 
        
        if(typeid(*a2).name() == "D")
            otherFunction2(); 
        
    
  

但是,有一大堆问题:

1) 我读过 typeid.name 会根据编译器产生不同的结果,因此我不想使用它。

2) 我考虑过创建一个“B”的实例,而不是写if(typeid(*a2) == typeid(instanceOfB)),但这将是很多工作,因为有很多构造函数参数......

3) 我也考虑过使用 dynamic_cast,但有些子类看起来像这样:

  A <-- B <-- C

所以如果我想检查参数是否为动态转换的 B,即使参数实际上是 C,它也会通过,因为 C 继承自 B

编辑:看来我必须重新考虑设计,但由于许多人表示设计存在缺陷,我将快速解释我的思路:

有一个窗口。几个不同的对象位于窗口内并四处移动,一个游戏。该功能应该用作碰撞检测。像这样: 遍历屏幕上的所有对象,检查是否发生碰撞。将两个碰撞的对象作为参数并调用此函数。 此函数查找不同的碰撞,例如“如果 a 是“箭头”而 a2 是“强盗”,则执行一些操作,但如果 a2 是“树”,则改为执行此操作!

【问题讨论】:

你的设计看起来很脆弱。您是否考虑过寻求更好的架构方式? 不要使用typeid - 请改用dynamic_cast() 您也可以在 type-id 上使用typeid 运算符,例如typeid(B)。这可能会解决您的问题,但无论如何您都可能会重新考虑您的设计。 您的第 3 点)表明您的设计存在根本缺陷:您似乎不能为其基类采用子类,但这是 OOP 的要点之一,允许子类代替基类,扩展功能,从不减少和很少改变行为。 stroustrup.com/multimethods.pdf 【参考方案1】:

A 中添加一些默认不执行任何操作并被其某些继承类覆盖的虚拟方法不是更好吗?

class A 
public:
    virtual void method(A *a2) 
    

    virtual void otherMethod() 
    
;

class B : public A 
public:
    virtual void method(A *a2) 
        a2->otherMethod();
    
;

class C : public B 
public:
    virtual void otherMethod() 
        // do your C stuff here
    
;

class D : public A 
public:
    virtual void otherMethod() 
        // do your D stuff here
    
;

这会实现你想要做的事情吗?

【讨论】:

为时已晚,无法继续工作,所以我明天将返回答案。 :)

以上是关于C++ 强制转换和 typeid的主要内容,如果未能解决你的问题,请参考以下文章

C++强制类型转换

C++ --- 强制转换运算符

C++中“强制转换”的四大天王

C++ 子类化、继承和强制转换

C++ 继承和强制转换

C++中的数据类型强制转换