0

如果我有一个指向AC++ 中基类的指针,我怎么能在我的代码中知道该指针是指向派生类B还是C

4

3 回答 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_castand 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 回答