知道基类指针指向哪个派生类

时间:2015-11-24 06:02:44

标签: c++ inheritance derived-class

假设我有一个Animal类和两个类 - Dog和Cat派生自它。 这样做是完全合法的 -

Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;

现在,给定a1和a2,我可以知道这个指针指向哪个派生类吗?

我现在唯一的想法是在Animal类中添加一个成员字段并在构造函数中初始化它。这甚至是一个好习惯吗?

4 个答案:

答案 0 :(得分:4)

是的,这是合法的,是的,这是回归原始类型的一种方式。您也可以使用dynamic_cast,但这会产生开销。一般来说,程序将它存储在派生类型中,并且只有当它没有关系时才用它引用它。

我发现如果你不得不做像dynamic_cast这样的事情,你必须重新考虑你的程序设计。

答案 1 :(得分:1)

您可以使用dynamic_cast查找。 Dynamic_cast使用运行时类型检查,如果无法相应转换,则会失败。

typeid(*a1).name.

此外,如果您使用VStudio,则可以使用 {{1}}它为您提供了由a1指针指向的类名。

答案 2 :(得分:1)

我同意Dominic的看法。我只想在这里添加两点,dynamic_cast开销因编译器而异,如果你没有重新设计程序的选项,那么你就没有选择,只能使用dynamic_cast 。(如果您确定类型的情况(不是您的情况),那么总是更喜欢使用static_cast,它的开销非常小。)

答案 3 :(得分:0)

我建议添加一个字段。

正如其他人所提到的那样,dynamic_cast<T>()可以使用,但你需要小心,知道什么时候会起作用,什么时候不起作用。要使它工作,您需要RTTI(运行时类型信息),它不总是存在/有效(例如使用库等时)。

我同意@Dominic McDonnell:

  

我发现如果你不得不做像dynamic_cast这样的事情,你必须重新考虑你的程序设计。

PS:如果您使用Qt,那么您可以使用qobject_cast<T>(),因为Qt将此类信息添加到QObject类型对象,而无需RTTI