可能重复:
找出类及其子类中的类类型
我有一个在基类中调用的方法,出现了一个新的要求,现在在这个方法中我需要知道它是从哪个子类派生的,你们碰巧知道这是否可能吗?
这就是虚函数的用途。在派生类中重写虚函数意味着基类不必了解派生类型的任何信息。一般来说,如果基类必须知道派生类,则反映了设计错误。
您可以使用RTTI找出答案:
DerivedClass *p = dynamic_cast<DerivedClass*>(this);
if (p != null) { ...use p... }
不过,您可能不想这样做。使用基类的重写方法几乎总是有更好的方法。
不可能以可靠的方式找出答案!想想在运行时加载的共享库,你会如何应对这样的事情?
采用上述答案中的方法时
DerivedClass *p = dynamic_cast<DerivedClass*>(this);
if (p != null) { ...use p... }
对于在编译时不知道派生类的情况,您将无法做出反应,因为您不知道它们的类型。
C++ 没有强烈的反射概念,所以我会回答“不”。
这是一个示例来说明 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的输出。