派生类,基类类型转换
2015-06-19 10:26
302 查看
首先记住:
派生类引用和指针能隐式转换为基类引用和指针;
不存在从基类向派生类的隐式转换,即使一个基类的指针或引用绑定在一个派生类对象上,也不能执行从基类到派生类的转换。
下面我对上面两句话举例说明:
一、
C++标准并没有明确规定派生类的对象在内存中如何分布,但我们可以认为Base,Derived 对象如下图所示:
注:上图是概念模型不是物理模型
因为派生类对象含有和基类相应的组成部分,所以我们能把派生类当作基类对象来使用,而且我们也能把基类的指针或引用绑定到派生类对象中的基类部分上。
二、
其实第二句话很显然,如果编译器对上面的代码通过,那么 ptr->selfFun()会是怎样的结果,没人知道,因为 Base 对象不含有 selfFun() 函数,所以这种定义是错误的。
派生类引用和指针能隐式转换为基类引用和指针;
不存在从基类向派生类的隐式转换,即使一个基类的指针或引用绑定在一个派生类对象上,也不能执行从基类到派生类的转换。
下面我对上面两句话举例说明:
一、
class Base { public: void fun1(); void fun2(); virtual void virfun(); private: int v1; float v2; }; class Derived : public Base { public: void selfFun(); private: int de; };
C++标准并没有明确规定派生类的对象在内存中如何分布,但我们可以认为Base,Derived 对象如下图所示:
注:上图是概念模型不是物理模型
因为派生类对象含有和基类相应的组成部分,所以我们能把派生类当作基类对象来使用,而且我们也能把基类的指针或引用绑定到派生类对象中的基类部分上。
Base objBase; // 基类对象 Derived objDer; // 派生类对象 Base* ptr = &objBase; // ptr 指向 Base 对象 ptr = &objDer; // ptr 执行 Derived 对象的 Base 部分 Base &ref = objDer; // ref 绑定到 Derived 对象的 Base 部分
二、
Base objBase; Derived objDer; Derived *ptr = &objBase; // 错误 Derived &ref = objBase; // 错误
其实第二句话很显然,如果编译器对上面的代码通过,那么 ptr->selfFun()会是怎样的结果,没人知道,因为 Base 对象不含有 selfFun() 函数,所以这种定义是错误的。
相关文章推荐
- 修改Azure Website 移动服务 默认时区
- Python学习 之 数据类型(邹琪鲜 milo)
- JS实现冒泡排序
- 毕业一年一点不平凡经历,不平常的感受,有了不平常的自信
- Python写的一个简单监控系统
- mysql批量kill
- ALSA howto
- C# Dictionary用法
- Maximal Square
- C#: 数据绑定
- Xamarin iOS教程之键盘的使用和设置
- CocoaPods安装和使用教程
- linux alarm函数
- 测试相关理解(二)等价类划分实例
- o2o家庭助手demo
- 23、java 通过System.getProperties()获取系统参数
- swap函数探讨
- CocoaPods一个Objective-C第三方库的管理利器
- C# list使用方法
- MFC中CString转换成char数组的问题