C++的类型转换运算符:dynamic_cast

这篇具有很好参考价值的文章主要介绍了C++的类型转换运算符:dynamic_cast。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++的类型转换运算符:dynamic_cast

顾名思义,与静态类型转换相反,动态类型转换在运行阶段(即应用程序运行时)执行类型转换。
可检查 dynamic_cast 操作的结果,以判断类型转换是否成功。使用 dynamic_cast 运算符的典型语法如下:

destination_type* Dest = dynamic_cast<class_type*>(Source);
if(Dest) // Check for success of the casting operation
    Dest->CallFunc ();

例如:

Base* objBase = new Derived();
// Perform a downcast
Derived* objDer = dynamic_cast<Derived*>(objBase);
if(objDer) // Check for success of the cast
    objDer->CallDerivedFunction ();

如上述代码所示,给定一个指向基类对象的指针,程序员可使用 dynamic_cast 进行类型转换,并在使用指针前检查指针指向的目标对象

的类型。在上述示例代码中,目标对象的类型显然是 Derived,因此这些代码只有演示价值。然而,情况并非总是如此,例如,将

Derived* 传递给接受 Base* 参数的函数时。该函数可使用 dynamic_cast 判断基类指针指向的对象的类型,再执行该类型特有的操作。总之,可使用 dynamic_cast 在运行阶段判断类型,并在安全时使用转换后的指针。

虚基类(或称抽象类)可以使用dynamic_cast,但是,非虚基类不可以。

在dynamic_cast被设计之前,C++无法实现从一个虚基类到派生类的强制转换。dynamic_cast就是为解决虚基类到派生类的转换而设计的。

示例代码:

子类—>父类(虚基类)

#include <stdio.h>
#include <stdlib.h>
 
//美术家
class Artist {
    public:
        virtual void draw() {printf("Artist draw\n");}
};
 
//音乐家
class Musician {
	public:
};
 
//教师
class Teacher {
    public:
        virtual void teachStu() {printf("Teacher teachStu\n");}
};
 
//即是美术,又是音乐家,又是教师的人
class People: public virtual Artist,public virtual Musician,public Teacher {
	public:
 
};
 
void test1() {
 
	People *p1 = new People();
	p1->draw();
	p1->teachStu();
 
	printf("\ndynamic_cast test:\n");
 
	Artist *a1 =  dynamic_cast<Artist*>(p1);
	//Artist *a1 =  p1; //向上转换,C++总是能够正确识别。即将派生类的指针赋值给基类指针。
 
	a1->draw();     //success: 打印Artist draw
	//a1->teachStu(); //error: no member named 'teachStu' in 'Artist'
 
}
 
int main() {
	test1();
 
	return 0;
 
}

说明:

1)继承关系:People 继承自Artist,Musician,Teacher三个类;

2)语意:Artist美术家,Musician音乐家,Teacher教师。

People类:定义一个特殊的People类,它的特点是:既是美术家,又是音乐家,也是教师。

上面的代码,运行结果如下:

Artist draw
Teacher teachStu
dynamic_cast test:
Artist draw

分析:

下面两条语句均正确,都能由子类People转化为父类Artist,并且调用父类Artist的成员函数成功。

Artist *a1 =  dynamic_cast<Artist*>(p1); 等价于
Artist *a1 =  p1; 
a1->draw();     //success: 打印people teachStu

可见,向上转换,无论是否用dynamic_cast,C++总是能够正确识别,即将派生类的指针赋值给基类指针。

父类(虚基类)—>子类,采用虚继承的方式:

对于上面的类,再看如下代码:

void test1() {
 
	People *p1 = new People();
	
	printf("\ndynamic_cast test:\n");
 
	Artist *a1 = p1; //success
	//People *p2 = (People*)a1; //error: cannot cast 'Artist *' to 'People *' via virtual base 'Artist'
	People *p3 = dynamic_cast<People*>(a1);//success:加了dynamic_cast,进行强转
}

分析:

1)//People *p2 = (People*)a1; //error: cannot cast 'Artist *' to 'People *' via virtual base 'Artist'
明确说明,无法直接用 (T*)b 的形式去进行由父类指针到派生类指针的转换;

2)People *p3 = dynamic_cast<People*>(a1);//success:加了dynamic_cast,进行强转

由父类指针到派生类指针的转换通过dynamic_cast 完成。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器文章来源地址https://www.toymoban.com/news/detail-609273.html

到了这里,关于C++的类型转换运算符:dynamic_cast的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包