
8-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片
如下,可以用下面的代码测试。父类公开接口
而当父类的指针(引用)指向父类时,该指针可以通过强转转换为子类类型的指针,但是这样的操作容易产生越界现象。因为父类范围小,子类范围大
发布日期:2021-05-06 07:22:48
浏览次数:31
分类:精选文章
本文共 1583 字,大约阅读时间需要 5 分钟。
父类和子类对象赋值转换(公有继承)
…
… …父类和子类对象赋值转换是指:子类对象可以赋值给父类对象(父类的指针或引用也可以),而父类对象不能赋值给子类对象。也就Student
一定是Person
,但Person
不一定是Student
。我们把这种操作称之为切片,因为子类对象赋值给父类对象时只赋值了一部分

_name
,方便子类继承后修改,首先分别创建父类和子类对象,使用的值就是给定的缺省值,然后将子类赋值给父类 #include#include using namespace std;class Person{ public: void print() { cout << "姓名" << _name << endl; cout << "年龄" << _age << endl; } string _name = "Job";protected: int _age = 18;};class Student : public Person{ public: void print_name() { cout << _name << endl; }};int main(){ Person p1; Student s1; cout << "没有赋值前的父类p1:"; p1.print(); cout << endl; cout << "没有修改前的子类s1:"; s1.print(); cout << endl; s1._name = "Lucy";//子类修改 cout << "子类s1修改为:"; s1.print(); cout << endl; p1 = s1;//把子类赋值给父类 cout << "赋值后的父类p1:"; p1.print(); cout << endl;}
#include#include using namespace std;class Person{ public: void print() { cout << "姓名" << _name << endl; cout << "年龄" << _age << endl; } string _name = "Job";protected: int _age = 18;};class Student : public Person{ public: void print_name() { cout << _name << endl; }};void print(Person p){ p.print();}int main(){ Person p1; Student s1; s1._name = "Lucy";//子类修改 print(p1);//Person可以调用 print(s1);//student也可以调用,因为切片}

- 如果在上面的
print
函数中,形参修改为引用,并且直接修改name
值,可以发现的确是引用的效果
当父类的指针(引用)指向子类时,父类的指针(引用)是可以通过强转转换为子类的指针(引用)的。因为父类指针的范围一般小于子类的范围,所以转换时是安全的




发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月28日 07时33分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
DataStax Bulk Loader教程(四)
2021-05-09
.NET应用框架架构设计实践 - 概述
2021-05-09
Rust 内置 trait :PartialEq 和 Eq
2021-05-09
Hibernate(十四)抓取策略
2021-05-09
[菜鸟的设计模式之旅]观察者模式
2021-05-09
Spring-继承JdbcDaoSupport类后简化配置文件内容
2021-05-09
Java基础IO流(一)
2021-05-09
Hibernate入门(四)---------一级缓存
2021-05-09
MySQL事务(学习笔记)
2021-05-09
一个web前端开发者的日常唠叨
2021-05-09
内存分配-slab分配器
2021-05-09
技术写作技巧分享:我是如何从写作小白成长为多平台优秀作者的?
2021-05-09
Jupyter Notebook 暗色自定义主题
2021-05-09
[Python学习笔记]组织文件
2021-05-09
基于Redo Log和Undo Log的MySQL崩溃恢复流程
2021-05-09
从RocketMQ的Broker源码层面验证一下这两个点
2021-05-09
如何正确的在项目中接入微信JS-SDK
2021-05-09
纵览全局的框框——智慧搜索
2021-05-09
快服务流量之争:如何在快服务中占领一席之地
2021-05-09
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2021-05-09