基类与派生类转换-指针赋值

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中没有进行定义,所以,访问异常。

经过这些测试,我们可以总结出:不可以把一个基类对象赋值给派生类对象,否则,导致派生类对象中自己新增的成员没有初始化,得到一个不完整的派生类对象。容易导致程序异常。

以上是关于基类与派生类转换-指针赋值的主要内容,如果未能解决你的问题,请参考以下文章

基类与派生类转换-对象赋值

Part7 继承与派生 7.3基类与派生类类型转换

继承

C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承

C++的探索路11继承与派生之拓展篇--多形式派生以及派生类指针转换

基类与派生类的指针和成员函数调用原理