假设我有一个Animal类和两个类 - Dog和Cat从它派生。 这是完全合法的做到这一点 -知道哪个派生类的基类指针指向
Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;
现在,由于A1和A2,我可以知道哪个派生类中该指针指向?
我现在唯一的想法是在Animal类中添加一个更多成员字段并在构造函数中初始化它。这是一个很好的做法吗?
假设我有一个Animal类和两个类 - Dog和Cat从它派生。 这是完全合法的做到这一点 -知道哪个派生类的基类指针指向
Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;
现在,由于A1和A2,我可以知道哪个派生类中该指针指向?
我现在唯一的想法是在Animal类中添加一个更多成员字段并在构造函数中初始化它。这是一个很好的做法吗?
是的,这是合法的,是的,这是回到原来的类型的一种方式。你也可以使用dynamic_cast,但是它有开销。通常,程序将其存储在派生类型中,并且只在与基类无关时引用它。
我发现如果你不得不做类似dynamic_cast的事情,你必须重新考虑你的程序的设计。
您可以使用dynamic_cast查找。 Dynamic_cast使用运行时类型检查,如果无法相应转换,将会失败。
ex: Derived* d = dynamic_cast<Derived*>(base)
此外,如果您使用VStudio,您可以使用 typeid(*a1).name.
这会给你的类名由A1指针指向。
我会建议添加一个字段。
正如其他人所说,dynamic_cast<T>()
可以使用,但你需要小心,知道什么时候会工作,什么时候不工作。它的工作,你需要RTTI(运行时类型信息),这是并不总是存在/有效
我同意@Dominic麦克唐纳(例如使用库等时):
我觉得如果你必须做一些类似dynamic_cast的事情,你必须重新考虑你的程序的设计。
PS:如果您使用的是Qt,那么你可以使用qobject_cast<T>()
因为Qt的增加这种类型的信息QObject
类型的对象,而不需要RTTI
我多米尼克同意。我只是喜欢在这里添加两点,dynamic_cast
开销因编译器不同而不同,如果您没有重新设计程序的选项,那么您没有选择余地,但要使用dynamic_cast
。(如果情况(不是您的情况有问题的地方)你确定的类型,然后总是喜欢使用static_cast
,它的开销非常小。)
这不会提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/评论/低质量帖/ 10315029) –
@BartłomiejSemańczyk...答案是使用其他人建议的dynamic_cast。 –
不,这不是好习惯。这通常表明还有更多的想法可以做。 – molbdnilo