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