如果我在C ++中有一个指向基类A
的指针,我怎么能在我的代码中告诉指针是派生类B
还是C
?
答案 0 :(得分:6)
假设基类A
是多态的(即它至少有一个虚函数),您可以使用dynamic_cast
。给定A* ap;
:
if (B* bp = dynamic_cast<B*>(ap)) {
// the object is a B
}
else if (C* cp = dynamic_cast<C*>(ap)) {
// the object is a C
}
答案 1 :(得分:2)
您通常不需要知道:
struct A {
virtual int generate_foo() = 0;
};
struct B : A {
int generate_foo() { return 42; }
};
struct C : A {
i_;
C(int i) : i_(i) { }
int generate_foo() { return i_++; }
};
如果你有一个A*
,你(1)知道它有一个generate_foo()
方法,并且(2)知道generate_foo()
会为你真正做的任何对象生成一个合适的foo有。一般来说,这应该足够了,你应能够跟踪你何时拥有A*
。
哲学上,C ++的设计者花费数年时间试图避免添加运行时类型信息,因为它太容易被错误地使用。然而,他们最终决定他们在失败的战斗中走错了路,并添加了dynamic_cast
和typeinfo()
。 C ++ 0x会增加更多。
答案 2 :(得分:1)
另一种方法,
if ( typeid(*pBase) == typeid(A))
{
cout << "A" << endl;
}
else if ( typeid(*pBase) == typeid(B))
{
cout << "B" << endl;
}
else if ( typeid(*pBase) == typeid(C))
{
cout << "C" << endl;
}
else
{
cout << "something else" <<endl;
}
但是我更喜欢James的方法,因为使用它不仅可以确定类型,,而且还可以使用类型转换的实例,之后!