1

可能重复:
找出类及其子类中的类类型

我有一个在基类中调用的方法,出现了一个新的要求,现在在这个方法中我需要知道它是从哪个子类派生的,你们碰巧知道这是否可能吗?

4

4 回答 4

8

这就是虚函数的用途。在派生类中重写虚函数意味着基类不必了解派生类型的任何信息。一般来说,如果基类必须知道派生类,则反映了设计错误。

于 2012-08-24T16:54:17.370 回答
1

您可以使用RTTI找出答案:

DerivedClass *p = dynamic_cast<DerivedClass*>(this);
if (p != null) { ...use p... }

不过,您可能不想这样做。使用基类的重写方法几乎总是有更好的方法。

于 2012-08-24T16:54:00.920 回答
1

不可能以可靠的方式找出答案!想想在运行时加载的共享库,你会如何应对这样的事情?

采用上述答案中的方法时

DerivedClass *p = dynamic_cast<DerivedClass*>(this);
if (p != null) { ...use p... }

对于在编译时不知道派生类的情况,您将无法做出反应,因为您不知道它们的类型。

C++ 没有强烈的反射概念,所以我会回答“不”。

于 2012-08-24T16:54:27.333 回答
1

这是一个示例来说明 PeteBecker 答案背后的想法:

#include <cstdio>    

class Base {

public:

    virtual char const * type () const = 0;

};

class DerivedA : public Base {

public:

    char const * type () const
    {
        return "A";
    }

};


class DerivedB : public Base{

public:

    char const * type () const
    {
        return "B";
    }

};

int main ()
{
    Base * a = new DerivedA();
    Base * b = new DerivedB();

    fprintf(stderr, "a has type '%s'\n", a->type());
    fprintf(stderr, "b has type '%s'\n", b->type()); 

    delete a;
    delete b;

    return 0;
}

看看http://ideone.com/HaAnY的输出。

于 2012-08-24T17:44:25.350 回答