《C++从代码示例入手》系列文章将带你开启 C++编程的探索之旅。通过大量简单且实用的代码示例,由浅入深地展现 C++的核心知识点,包括变量、数据类型、运算符、控制结构、函数等。每一个代码示例都有详细的解释和注释,让你能轻松理解代码的功能和运行原理,助你逐步掌握 C++的编程技巧,快速提升编程能力,为后续深入学习和开发打下坚实基础。
关于IDE开发工具的运行环境安装配置,请参看:【C 语言】从代码示例入手(零)
各位朋友在学习C++之前最好可以先学习一下C语言的基础知识,因为C语言和C++还可以混合编程,语法也类似一些,最重要的是指针内存方面的知识还是需要知道一些的。
具体可以参看:【C 语言】从代码示例入手
目录
(5)父类与子类之间的多态类型转换dynamic_cast举例
一、父类与子类类型转换
- dynamic_cast应用
- 使用dynamic_cast转换的Base类至少带有一个虚函数
1、指针类型转换
(1)基本转换01
源代码:
#include <iostream>
using namespace std;
//基类
class Base {
public:
Base() {};
//虚函数
virtual void show() { cout << "This is Base calss"<<endl; }
};
//子类
class Sub :public Base {
public:
Sub() {};
//实现虚函数
void show() { cout << "This is Sub class"<<endl; }
//普通函数
void subFun() { cout << "This is subFun()"<<endl; }
};
int main() {
//1、创建父类与子类对象
Base *base;
Sub *sub = new Sub;
//2、子类转父类
//base = dynamic_cast<Base*>(sub); //正确,但不必要。
base = sub; //向上转换总是安全的
//3、父类调用Show()
base->show(); // This is Sub class 子类转父类,安全,且转换后,还是调用子类的虚函数,
//base->subFun(); //ERR: subFun不是Base的成员 子类转父类,安全,但是转换后,不能再使用子类的非虚函数,
//4、父类转子类
sub = dynamic_cast<Sub*>(base);
//5、子类调用Show()、subFun()
sub->show();
sub->subFun();
return 0;
}
运行结果:
代码说明:
Base类:
- 定义了一个默认构造函数
Base(),用于创建Base类的对象。- 定义了一个虚函数
show(),使用virtual关键字修饰,这使得该函数具有多态性。当通过基类指针或引用调用该函数时,会根据实际对象的类型来决定调用哪个版本的show()函数。Sub类:
- 继承自
Base类,使用public继承方式,表示基类的public和protected成员在子类中保持原有访问权限。- 定义了一个默认构造函数
Sub(),用于创建Sub类的对象。- 重写了基类的虚函数
show(),提供了子类自己的实现。- 定义了一个普通成员函数
subFun(),该函数是Sub类特有的,基类中没有该函数。Sub sub01;:创建一个Sub类的对象sub01,调用Sub类的默认构造函数进行初始化。Sub & sub02 = sub01;:声明一个Sub类的引用sub02,并将其初始化为引用sub01。引用是对象的别名,sub02和sub01实际上指向同一个对象。Base & base = dynamic_cast<Base&>(sub02);:
- 使用
dynamic_cast进行类型转换,将Sub类的引用sub02转换为Base类的引用base。- 这是一个向上类型转换,因为
Sub类是Base类的子类。向上类型转换是安全的,因为子类对象包含了基类对象的所有成员。dynamic_cast在这里确保了类型转换的安全性,并且会在运行时检查类型信息。base.show();:
- 通过
Base类的引用base调用show()函数。- 由于
show()是虚函数,根据多态性原理,实际调用的是Sub类中重写的show()函数,因此会输出"This is Sub class"。

最低0.47元/天 解锁文章
1575

被折叠的 条评论
为什么被折叠?



