0

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

像这样:

    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 是“树”,则改为执行此操作!

4

1 回答 1

3

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

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

于 2013-08-05T19:59:02.080 回答