C ++ cast和typeid

时间:2013-08-05 19:10:33

标签: c++ inheritance casting typeid

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

像这样:

    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不同的碰撞,如“如果是”箭头“和a2是”强盗“然后做一些东西,但如果a2是”树“,改为执行此操作!

1 个答案:

答案 0 :(得分:2)

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

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