C ++基类怎么知道知道哪个类派生了它?

时间:2012-08-24 16:50:06

标签: c++ oop

  

可能重复:
  find out the class type inside the class and its children

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

4 个答案:

答案 0 :(得分:8)

虚拟功能的用途。覆盖派生类中的虚函数意味着基类不必知道有关派生类型的任何信息。通常,如果基类必须知道派生类,则它反映了设计错误。

答案 1 :(得分:1)

您可以使用RTTI查找:

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

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

答案 2 :(得分:1)

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

在上面给出的答案中采用方法时

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

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

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

答案 3 :(得分: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