C++ C++;铸造和类型ID

C++ C++;铸造和类型ID,c++,inheritance,casting,typeid,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"){ otherFunction

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

像这样:

    void function(A* a, A* a2){

    if (typeid(*a).name() == "B"){
        if(typeid(*a2).name() == "C"){
            otherFunction(); 
        }
        if(typeid(*a2).name() == "D"){
            otherFunction2(); 
        }
    }
  }
然而,有一个完整的buncha问题:

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

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

3) 我也考虑过使用dynamic_cast,但有些子类如下所示:

  A <-- B <-- C

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

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

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

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

您的设计似乎非常脆弱。你有没有想过寻求一种更好的方法来构建它?不要使用
typeid
-而是使用
dynamic\u cast()
。你也可以在类型id s上使用
typeid
操作符,比如
typeid(B)
。这可能会解决您的问题,但您可能会重新考虑您的设计。您的观点3)表明,您的设计存在根本缺陷:您似乎无法将子类作为其基类,但这是OOP的一个要点,允许子类代替基类,扩展功能,从不减少和很少改变行为。你的设计看起来很脆弱。你有没有想过寻求一种更好的方法来构建它?不要使用
typeid
-而是使用
dynamic\u cast()
。你也可以在类型id s上使用
typeid
操作符,比如
typeid(B)
。这可能会解决您的问题,但您可能会重新考虑您的设计。您的观点3)表明,您的设计存在根本缺陷:您似乎无法将子类作为其基类,但这是OOP的一个要点,允许子类代替基类,扩展功能,永远不要减少和很少改变行为。太晚了,无法继续工作,所以我明天会带着答案回来。:)太晚了,无法继续工作,所以我明天会带着答案回来。:)