C ++多态性:如何测试一个类是否衍生自另一个基类?

时间:2018-07-20 06:35:28

标签: c++ polymorphism

很抱歉标题的字眼;我不知道如何做得更好。但是我的问题的要点是:

#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

2 个答案:

答案 0 :(得分:7)

您可以像这样执行dynamic_cast

 if (dynamic_cast<Base2 *>(p)) {

online_compiler

与使用typeid的方法不同,该方法不需要包含额外的标头,但是它也依赖于RTTI(这意味着这些类需要是多态的)。

答案 1 :(得分:0)

这听起来像X-Y问题。

对RTTI的需求(或对测试其所属类的对象的需求)通常是不良设计的标志-您根本就不需要这样的测试/信息。
如果层次结构设计合理,则虚拟功能将承担这些测试的作用。

要找出设计不当的内容,请问自己“一旦获得信息,我将如何处理?”答案总是这样的:“我将做一个if / switch / ...来区别对待它们”;正确的解决方案是用相同的方式对待它们-调用虚拟方法,每个对象都带有正确的虚拟方法的知识,知道该方法需要做什么。