首先,这篇文章并不完全正确 . dynamic_cast检查对象的类型并且可能失败,static_cast不检查并且很大程度上要求程序员知道他们正在做什么(虽然它会针对一些严重的错误发出编译错误),但 they may both be used in polymorphic situations . (dynamic_cast还有一个附加要求,即至少有一个涉及的类型有一个虚方法 . )
简而言之,C中的多态性是 using objects through a separately-defined interface . 该接口是基类,当它具有虚拟方法时,它几乎总是有用 .
static_cast 可以在指向相关类的指针之间执行转换,不仅可以从派生类到其基类,还可以从基类到其派生类 . 这确保了如果转换了正确的对象,至少类是兼容的, but no safety check is performed during runtime 以检查被转换的对象实际上是否是目标类型的完整对象 . 因此,程序员应确保转换是安全的 . 另一方面,避免了dynamic_cast的类型安全检查的开销 .
5 回答
首先,这篇文章并不完全正确 . dynamic_cast检查对象的类型并且可能失败,static_cast不检查并且很大程度上要求程序员知道他们正在做什么(虽然它会针对一些严重的错误发出编译错误),但 they may both be used in polymorphic situations . (dynamic_cast还有一个附加要求,即至少有一个涉及的类型有一个虚方法 . )
简而言之,C中的多态性是 using objects through a separately-defined interface . 该接口是基类,当它具有虚拟方法时,它几乎总是有用 .
然而,在没有任何虚拟方法的情况下拥有多态性是罕见但可能的;通常这是一个糟糕的设计或不得不满足外部要求的标志,因此,没有办法给出一个适合这里的好例子 . (“当你看到它时,你会知道什么时候使用它”,不幸的是,这是我能给你的最佳建议 . )
多态性例子:
稍微练习上面的类 - 也看我的generic factory example:
它也可以use polymorphism without inheritance,因为它实际上是一种设计技巧或风格 . (我拒绝在这里使用流行语模式......:P)
static_cast 可以在指向相关类的指针之间执行转换,不仅可以从派生类到其基类,还可以从基类到其派生类 . 这确保了如果转换了正确的对象,至少类是兼容的, but no safety check is performed during runtime 以检查被转换的对象实际上是否是目标类型的完整对象 . 因此,程序员应确保转换是安全的 . 另一方面,避免了dynamic_cast的类型安全检查的开销 .
static_cast也可用于执行任何其他非指针转换,也可以隐式执行,例如基本类型之间的标准转换:
dynamic_cast 只能用于指针和对象的引用 . 其目的是确保类型转换的结果是所请求类的有效完整对象 .
因此,当我们将类转换为其基类之一时,dynamic_cast总是成功的 .
Compatibility note :dynamic_cast需要运行时类型信息(RTTI)来跟踪动态类型 . 某些编译器支持此功能作为默认禁用的选项 . 必须为运行时类型检查启用此选项,以使用dynamic_cast正常工作 .
Virtual Functions 负责C中的运行时多态性 . 具有至少一个虚函数的类具有多态类型 .
Read More....
阅读this . 已经清楚地写了
A class that declares or inherits a virtual function is called a polymorphic class.
嗯,答案很简单 . 具有至少一个虚函数的类称为多态类型 . 这也可能只是一个析构函数 .
所以以下是'多态类型' .
我认为完整的短语是“多态型铸造” . 你是对的,static_cast适用于与继承无关的类型(double-int等),其他答案指出了强制转换的工作方式 .
我不认为该声明暗示存在神秘的多态类型 - 只是static_cast也适用于不相关的类型 . 该声明虽然有点令人困惑,但澄清一下是件好事 .
我认为我们总是将任何类的析构函数定义/声明为虚拟,尤其是在继承树中 . 然后我们可以说继承树中的几乎所有类都是多态的 .