如何恢复基类指针指向的对象的原始类型?

时间:2014-01-03 09:06:53

标签: c++ class object pointers

我有两个类,B和C,子类化一个抽象类A和一个带有指向A param的指针的函数f。 有没有一种简单的方法让f()检测所获得的指针是指向B还是C?

class A {
//...
};

class B : public A {
//...
};

class C : public A {
//...
};

int f(A* arg);

2 个答案:

答案 0 :(得分:3)

你不应该关心:这几乎就是多态性的全部内容。

但是,如果真的需要知道,你有两个(合理的)选择:

1)使用dynamic_cast。对于指针强制转换,如果指针不是预期类型,则结果为nullptr。对于引用转换,如果引用不是期望的类型,则抛出异常。

2)构建子类实现的虚函数,例如,表示类型的enum

(1)是优选的。但是,首先要考虑为什么需要这个。

答案 1 :(得分:1)

如果你发现自己不得不做这种事情,那么你就不会使用多态,可能需要检查你的设计。但您可以使用dynamic_cast并测试:

B* b = dynamic_cast<B*>(someAPtr);
if (b)
{
  // cast succeeded, object pointed at is-a-B
}

这将是一个使用多态的设计:

struct A {
  virtual void foo() const {}
};

struct B : A {
  void foo() const override {}
};

struct C : A {
  void foo() const override {}
};

int f(A* arg) { 
  arg->foo();
  return 42; 
}

请注意override specifier是C ++ 11。如果您的编译器不支持它,您可以省略它。它只是确保我不会错误地覆盖基类的虚方法。