C++编程疑难杂症
发布网友
发布时间:2024-10-19 14:30
我来回答
共1个回答
热心网友
时间:2024-11-13 12:56
我也来说一下。
这个原因是对象切割导致的。
首先说一下对象包含。我们知道,大多数编译器的原理是认为,子类包含基类。
所以s2中有一个s1。
void print(s1 s),当传递一个s2的对象时,因为s2不是s1,会进行类型转换,如果向上转换是默认的,一般都会成功。但是基类中不含有s2中私有的东西。所以在进行转换的时候,是不会把子类中私有的东西转换为基类中的东西的。
那么在进行转换的时候,会把子类中属于基类的东西复制到临时对象中,然后才赋函数进行运算。
这就发生了对象切割,即把子类中自己的东西去除,而保存基类固有的。这是C++继承中要避免的问题。很多高级读本都有这个东西的介绍。
所以实际上传递给函数的是一个基类的对象,而不是一个子类对象。输出的就是基类的成员函数。
一般这种都会传递一个引用或指针,以免出现对象切割。