基类与派生类转换-指针赋值
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基类与派生类转换-指针赋值相关的知识,希望对你有一定的参考价值。
3.3 指针赋值
上面介绍了“引用赋值”的操作,那么,我们也可以进行“指针赋值”,定义main()函数如下:
int main(void)
student_new stud("wkf","www.mylinux.vip",13926572996);
student* ps = &stud;
ps->print();
return 0;
程序运行结果如下:
g++ test.cpp -o exe
wkf@ubuntu:~/c++$ ./exe
name = wkf
addr = www.mylinux.vip
派生类析构函数
基类析构函数,释放name=wkf
可以看到,输出结果与“引用赋值”的执行结果一样。ps指针对象是student类型,指向student_new对象stud的起始地址。
那么,通过ps指针对象访问的成员,就是stud对象从student基类继承过来的数据。而且,指针对象ps结束的时候,不会调用析构函数。所以,不会导致stud.name成员内存的多次释放。
3.4 基类对象赋值给派生类对象
经过上面的学习,我们知道,可以把一个派生类对象赋给一个基类对象。那么,赋值的是派生类对象从基类继承过来的数据。在派生类中自己新增的数据,无法赋值给基类对象。因为,基类对象中的成员,根本就没有派生类对象中自己新增定义的数据。
那么,根据这个思路,应该是不可以把一个基类对象,赋给一个派生类对象。因为,一个基类对象的成员中,根本就没有派生类对象中自己新增的成员。所以,无法完全给派生类对象进行设置。那么,就得到一个不完整的派生类对象。这就是非法的操作。
程序测试代码如下:
程序运行结果如下:
可以看到,编译错误,无法把派生类student_new的对象,赋值给基类student对象。
如果修改成引用类型,定义如下:
int main(void)
student stud("wkf","www.mylinux.vip");
student_new& s = stud;
s.print_new();
return 0;
编译结果如下:
wkf@ubuntu:~/c++$ g++ test.cpp -o exe
test.cpp: In function ‘int main()’:
test.cpp:45: error: invalid initialization of reference of type ‘student_new&’ from expression of type ‘student’
可以看到,引用赋值,不可以把一个基类student对象,设置给派生类student_new的引用。
那么,我们来测试一下“指针赋值”的操作,修改main()函数,代码如下:
int main(void)
student stud("wkf","www.mylinux.vip");
student_new* ps = (student_new*)&stud;
ps->print_new();
return 0;
程序运行结果如下:
可以看到,代码可以编译成功,但是,运行异常。因为,ps指向的是派生类student_new类型的对象,但是,给ps赋值的是基类student对象。
那么,当ps访问派生类student_new对象的print()函数时,输出的number信息是student_new派生类自己新增的数据。这些数据在student对象s中没有进行定义,所以,访问异常。
经过这些测试,我们可以总结出:不可以把一个基类对象赋值给派生类对象,否则,导致派生类对象中自己新增的成员没有初始化,得到一个不完整的派生类对象。容易导致程序异常。
以上是关于基类与派生类转换-指针赋值的主要内容,如果未能解决你的问题,请参考以下文章
C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承