2015-11-24 93 views
2

假设我有一个Animal类和两个类 - Dog和Cat从它派生。 这是完全合法的做到这一点 -知道哪个派生类的基类指针指向

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

现在,由于A1和A2,我可以知道哪个派生类中该指针指向?

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

+0

不,这不是好习惯。这通常表明还有更多的想法可以做。 – molbdnilo

回答

4

是的,这是合法的,是的,这是回到原来的类型的一种方式。你也可以使用dynamic_cast,但是它有开销。通常,程序将其存储在派生类型中,并且只在与基类无关时引用它。

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

1

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

ex: Derived* d = dynamic_cast<Derived*>(base) 

此外,如果您使用VStudio,您可以使用 typeid(*a1).name.这会给你的类名由A1指针指向。

+1

typeid不是纯粹的Visual Studio事物。 –

+0

是不是假设我知道基类指针的类型? 在我的问题中,我会写 'Cat * ptr = dynamic_cast a1'或 'Dog * ptr = dynamic_cast a1'? – Sashank

+0

是的。但是由于dynamic_cast是安全的强制转换(检查运行时类型信息以确保有意义的转换可以发生),您可以获取指向所请求类型的有效指针或null。如果您不知道指向的对象,则使用typeid(* a1).name =“Cat”,typeid(* a1)==“dog” – Nandu

0

我会建议添加一个字段。

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

我同意@Dominic麦克唐纳(例如使用库等时):

我觉得如果你必须做一些类似dynamic_cast的事情,你必须重新考虑你的程序的设计。

PS:如果您使用的是Qt,那么你可以使用qobject_cast<T>()因为Qt的增加这种类型的信息QObject类型的对象,而不需要RTTI

1

我多米尼克同意。我只是喜欢在这里添加两点,dynamic_cast开销因编译器不同而不同,如果您没有重新设计程序的选项,那么您没有选择余地,但要使用dynamic_cast。(如果情况(不是您的情况有问题的地方)你确定的类型,然后总是喜欢使用static_cast,它的开销非常小。)

+0

这不会提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/评论/低质量帖/ 10315029) –

+0

@BartłomiejSemańczyk...答案是使用其他人建议的dynamic_cast。 –

相关问题