很抱歉标题的字眼;我不知道如何做得更好。但是我的问题的要点是:
#include <iostream>
using namespace std;
class Base {};
class Base2 {};
class C : public Base, public Base2 {};
class D : public Base {};
void isDerivedFromBase2(Base *p) {
if (...) { /* test whether the "real object" pointed by p is derived from Base2? */
cout << "true" << endl;
}
cout << "false" << endl;
}
int main() {
Base *pc = new C;
Base *pd = new D;
isDerivedFromBase2(pc); // prints "true"
isDerivedFromBase2(pd); // prints "false"
// ... other stuff
}
如何测试由其基类指针Base *
表示的对象是否源自另一个基类Base2
?
答案 0 :(得分:7)
您可以像这样执行dynamic_cast
:
if (dynamic_cast<Base2 *>(p)) {
与使用typeid
的方法不同,该方法不需要包含额外的标头,但是它也依赖于RTTI(这意味着这些类需要是多态的)。
答案 1 :(得分:0)
这听起来像X-Y问题。
对RTTI的需求(或对测试其所属类的对象的需求)通常是不良设计的标志-您根本就不需要这样的测试/信息。
如果层次结构设计合理,则虚拟功能将承担这些测试的作用。
要找出设计不当的内容,请问自己“一旦获得信息,我将如何处理?”答案总是这样的:“我将做一个if / switch / ...来区别对待它们”;正确的解决方案是用相同的方式对待它们-调用虚拟方法,每个对象都带有正确的虚拟方法的知识,知道该方法需要做什么。