假设我有一个Animal类和两个类 - Dog和Cat派生自它。 这样做是完全合法的 -
Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;
现在,给定a1和a2,我可以知道这个指针指向哪个派生类吗?
我现在唯一的想法是在Animal类中添加一个成员字段并在构造函数中初始化它。这甚至是一个好习惯吗?
答案 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