类型转换——切片问题
2015-08-19 17:16
344 查看
一个子类的对象可以赋值给父类的变量,但是一个父类的对象是不能赋值给子类的变量的。
虽然子类的对象可以赋值给父类的变量,但是子类新定义的函数或数据成员是会丢失的,它不会传到父类的变量——切片问题
但是我们利用指向动态变量的指针,可以解决这个问题
结果是
虽然子类的对象可以赋值给父类的变量,但是子类新定义的函数或数据成员是会丢失的,它不会传到父类的变量——切片问题
但是我们利用指向动态变量的指针,可以解决这个问题
#include<iostream> #include<string> using namespace std; class pet { public: string name; virtual void print() const; }; class dog : public pet { public: string breed; virtual void print() const; //virtual 可写可不写 }; void pet::print() const { cout<<"name: "<<name<<endl; } void dog::print() const { cout<<"name: "<<name<<endl; cout<<"breed: "<<breed<<endl; } int main() { dog vdog; pet vpet; vdog.name = "black"; vdog.breed = "great"; vpet=vdog; cout<<"vpet.breed 是非法的"<<endl; vpet.print(); cout<<"vdog赋给vpet时,就已经丢失了breed了"<<endl; pet *ppet; dog *pdog; pdog = new dog; pdog->name = "white"; pdog->breed = "good"; ppet = pdog; cout<<"ppet.breed 也是不存在的,因为ppet的类型是pet"<<endl; ppet->print(); cout<<"pdog赋给ppet时,breed不会丢失,但是要通过虚函数才能访问它"<<endl; pdog->print(); return 0; }
结果是
相关文章推荐
- JavaScript
- maven编码 gbk 的不可映射字符
- 使用flask 构建基本的 restful api
- eclipse 搭建activiti5.17项目生成流程过程
- smack 创建账户
- How Do I Declare A Block in Objective-C?
- ACM 数论 质因数分解
- android 之popupWindow 在指定位置上的显示
- java实现String,date,timestamp相互转换
- Android APK反编译详解(附图)
- 一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
- ISP模块之RAW DATA去噪(一)
- 00-自测4. Have Fun with Numbers (20)
- Microsoft.Office.Interop.Excel的用法
- 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
- iOS开发日记5-推送(信鸽推送)
- 学习zepto.js(对象方法)[4]
- MVC后台与前台交互的问题。。。
- Single Number
- 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用