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值,可以发现的确是引用的效果
    在这里插入图片描述

当父类的指针(引用)指向子类时,父类的指针(引用)是可以通过强转转换为子类的指针(引用)的。因为父类指针的范围一般小于子类的范围,所以转换时是安全的

在这里插入图片描述
在这里插入图片描述
而当父类的指针(引用)指向父类时,该指针可以通过强转转换为子类类型的指针,但是这样的操作容易产生越界现象。因为父类范围小,子类范围大
在这里插入图片描述
在这里插入图片描述

上一篇:8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员
下一篇:8-1:C++继承之对继承的理解和继承的基本使用,继承的格式

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月28日 07时33分07秒