类型转换与继承
来源:互联网 发布:贪吃蛇java代码详解 编辑:程序博客网 时间:2024/05/22 15:28
可以将基类的指针或引用绑定到派生类对象上有一层极为重要的含义:当使用基类的引用(或指针),实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。
静态类型和动态类型
当我们使用存在继承关系的类型时,必须将一个变量或其他表达式的静态类型与该表达式表示对象的动态类型区分开来。表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型;动态类型则是变量或表达式表示的内存中的对象的类型。动态类型直到运行时才可知。
如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一致。
基类的指针或引用的静态类型可能与其静态类型不一致。
不存在从基类向派生类的隐式类型转换
因为一个基类的对象可能是派生类对象的一部分,也可能不是,所以不存在从基类向派生类的自动类型转换:
Base base;Derived* derivedPtr = &base; // 错误:不能将基类转换成派生类Derived& derivedRef = base; // 错误:不能将基类转换成派生类
即使一个基类指针或引用绑定在一个派生类对象上,我们也不能执行从基类向派生类的转换。
如果在基类中含有一个或多个虚函数,我们可以使用dynamic_cast请求一个类型转换,该转换的安全检查将在运行时执行。同样,如果我们已知某个基类向派生类的转换是安全的,则我们可以使用static_cast来强制覆盖掉编译器的检查工作。
在对象之间不存在类型转换
派生类向基类的自动转换只对指针或引用类型有效,在派生类类型和基类类型之间不存在这样的转换。
当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分将被忽略掉。
存在继承关系的类型之间的转换规则
要想理解在具有继承关系的类之间发生的类型转换,有三点非常重要:
1。从派生类向基类的类型转换只对指针或引用类型有效。
2。基类向派生类不存在隐式类型转换。
3。和任何其他成员一样,派生类向基类的类型转换也可能会由于访问受限而变得不可行。
- 类型转换与继承
- 多重继承与类型转换 -- 虚基类多继承
- C++继承与友元、继承与类型转换
- 继承类型转换
- 多重继承的虚函数表与类型转换
- C++ Smart Pointers 和“与继承有关的”类型转换
- 多重继承及类型转换
- 多重继承及类型转换
- 继承中的向上类型转换
- c++ 转换与继承
- C++转换与继承
- C++ 转换与继承
- C++ 转换与继承
- 转换与继承
- C++继承与转换
- 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
- 继承与静态成员,转换与继承
- 【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程
- MFC 按钮为什么设置不上ICON
- Java《数组》
- STM32学习笔记6——RTC
- 最近看的书
- 数据结构队列及其用法(C语言实现)
- 类型转换与继承
- 递归的使用
- 将汉化版QtCreator还原为英文版(希望汉化的也可参考)
- 虚拟跟踪球
- SD学习笔记一
- 黑马程序员——多线程
- hdu 2227 树状数组+dp
- Android EditText与输入法相关问题
- 最近忙的工作