C++ casting and typeid

C++ casting and typeid

本文关键字:typeid and casting C++      更新时间:2023-10-16

我得到了一个函数,它有两个基类指针,根据子类的不同,应该调用其他函数。。。

像这样:

    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

编辑:我似乎必须重新考虑这个设计,但由于许多人都说这个设计有缺陷,我会很快解释我的思路:

有一扇窗户。几个不同的物体位于窗户内并四处移动,就像一场游戏。该功能应起到碰撞检测的作用。像这样:浏览屏幕上的所有对象,检查是否发生碰撞。将两个碰撞的对象作为参数,并调用此函数。这个函数查找buncha不同的碰撞,比如"如果a是"箭头",a2是"土匪",那么做一些事情,但如果a2是"树",那么就做这个!

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
    }
};

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