【发布时间】:2018-02-24 16:17:20
【问题描述】:
假设我有两个类映射两个具有相同接口的对象
class FirstChild : class Father
{
//some fields and methods useful for class A
}
class SecondChild : class Father
{
//some fields and methods useful for class B
}
稍后,在代码中完成了类似的操作
Father* myInstance = new SecondChild();
现在,如果我想知道对象的 type 以便在实例是 FirstChild 或 SecondChild 时必须执行一些操作,我正在做类似的事情:
if (typeid (myInstance) == typeid (FirstChild))
{
// do stuff
} else if (typeid (myInstance) == typeid (SecondChild))
{
// do other stuff
}
这是正确的做法吗?
因为在StackOverflow 的某个地方我读到typeid 不安全,添加一个虚函数更方便,比如说getType,然后在FirstChild 中做
char* getType { return "FirstChild"; }
说实话,我不太喜欢这种解决方案,因为它似乎绕过了面向对象编程中强大的多态性。
那么,各位,你们怎么看?在 C++ 中检查子对象类型的最佳方法是什么?
【问题讨论】:
-
dynamic_cast可能吗?无论如何,这样做的必要性表明你有一个严重的设计缺陷。 -
如果您需要知道类型,您可能做错了。
-
这听起来像是你应该用多态性和虚函数来解决的问题。也许
dynamic_cast. -
虽然这并没有错,但这是(非常)旧的做事方式,除非您正在开发 C++ 插件。不要这样做,重新考虑你的设计。
-
面向对象的解决方案将使用虚函数来执行特定于类的逻辑,如果您要使用整数值,请不要使用 if-else if-else-if....使用 case 语句,虽然大多数优秀的编译器会优化你的 if-else 列表,但 case 会更容易阅读。
标签: c++ oop types casting type-conversion