8-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片相关的知识,希望对你有一定的参考价值。

父类和子类对象赋值转换(公有继承)



父类和子类对象赋值转换是指:子类对象可以赋值给父类对象(父类的指针或引用也可以),而父类对象不能赋值给子类对象。也就Student一定是Person,但Person不一定是Student我们把这种操作称之为切片,因为子类对象赋值给父类对象时只赋值了一部分
在这里插入图片描述
如下,可以用下面的代码测试。父类公开接口_name,方便子类继承后修改,首先分别创建父类和子类对象,使用的值就是给定的缺省值,然后将子类赋值给父类

#include <iostream>
#include <string>
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 <iostream>
#include <string>
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-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片的主要内容,如果未能解决你的问题,请参考以下文章

继承与多态C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

面向对象。对象的继承

C++继承

c++复习笔记——继承

C++继承多态总结

C++继承