不太理解这里函数参数为什么不可以设置为父类对象?
为什么只能使用父类引用或指针作为形参?
引用不就是对象的别名吗?
子类对象首先也是父类对象吧?
正在回答
你说的函数形参使用父类类型,然后使用时传递子类实例给函数,那么就涉及到子类到父类的拷贝构造。
比如现有如下定义:
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)把一个派生类拷贝给基类,尽管在内存上可行,但是会有一个大内存转小内存的过程,也就是截断,这是危险的。
因为这里就不行,所以函数传参用父类类型接收子类类型更不行了,一个道理。
- 参与学习 394 人
- 提交作业 22954 份
- 解答问题 1164 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星