不太理解这里函数参数为什么不可以设置为父类对象?

不太理解这里函数参数为什么不可以设置为父类对象?

图片描述

为什么只能使用父类引用或指针作为形参?
引用不就是对象的别名吗?
子类对象首先也是父类对象吧?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你说的函数形参使用父类类型,然后使用时传递子类实例给函数,那么就涉及到子类到父类的拷贝构造。

比如现有如下定义:

class Person {

    Person( );

    Person(const Person &other); //拷贝构造,拷贝的是同类.

};

class Man :public Person{

    Man( );

    Man(const Man &other);

};

int main( ){

    Person * p1 = new Man; //ok

    Man tom;

    Person &p2 = Tom; //ok

    Person p3 = Tom; //error

    Person p4(Tom); //error

后两行这样用是有条件的,那就是你必须在Person定义中提供如下拷贝构造:
Person::Person(const Man &other)!!!
尽管你可以去实现这个拷贝构造,但是如果你真的这么做了,编译器可能不跟你计较,但是你违背了两个原则:
1)基类应该是一成不变的,不应该随着时间流逝基类被不断派生,而需要不断补充基类的接口;
2)把一个派生类拷贝给基类,尽管在内存上可行,但是会有一个大内存转小内存的过程,也就是截断,这是危险的。

因为这里就不行,所以函数传参用父类类型接收子类类型更不行了,一个道理。

  • 我想跑路 提问者 #1

    引用不就是对象的别名吗?

      Person &p2 = Tom; //ok 

    这行是可以的啊

    2022-11-23 08:23:15
山行老师 2022-11-23 19:54:35
可以用基类引用派生类,也可以用基类指针指向派生类,这是因为这两个动作没有产生任何构造,都是用一个小的东西去指向一个大的东西。但是派生类不能用来拷贝构造基类,这个原因导致你说的直接使用父类接收子类做函数参数是不行的。
  • 提问者 我想跑路 #1

    明白了,原来直接传入子类对象,会调用构造函数,相当于想把子类构造成父类,这是不成立的。然后传入引用,和指针没问题,是cpp的特性吗?

    2022-11-23 20:27:26
  • 是的,cpp特性如此

    2022-11-24 00:54:21
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师