如果我有一个指向A
C++ 中基类的指针,我怎么能在我的代码中知道该指针是指向派生类B
还是C
?
问问题
215 次
3 回答
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
}
于 2010-12-13T07:05:02.473 回答
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
and typeinfo()
。C++0x 会增加更多。
于 2010-12-13T07:30:33.067 回答
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 的方法,因为使用它不仅可以确定type,而且之后还可以使用类型转换的实例!
于 2010-12-13T07:28:46.140 回答