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的一个要点,允许子类代替基类,扩展功能,永远不要减少和很少改变行为。太晚了,无法继续工作,所以我明天会带着答案回来。:)太晚了,无法继续工作,所以我明天会带着答案回来。:)