C++ 子类对象当父类对象使用

子类对象当父类对象使用

1⃣️把子类对象直接赋值给父类对象(等号左边是父类对象,等号右边是子类对象)
子类对象赋值给父类对象,仅仅把继承自父类部分成员函数赋值给父类对象
赋值完成后等号左边依然是一个父类对象
Derived d;
Base b;
b=d;//把子类对象d当成父类对象来使用
(父类对象不能赋值给子类对象,也就是说父类对象不能当成子类对象使用)
2⃣️父类的引用指向子类对象
(1)用子类对象初始化父类引用
Base b1(1);
Derived d1(10,10);
Base &b2=d1;// 子类对象当父类对象
b2.print(); // 调用父类函数
b2依然不能调用扩展的成员函数
(2)函数形参是父类引用,而实参是子类对象
void func(Base &b){}
Base b1(1);
Derived d1(10,20);
func(d1); // 子类对象当成父类对象使用
(3) 函数返回值类型是父类引用,返回值为一个子类对象
Base& func1(){
Derived *d=new Derived(10,20);// 子类对象当成父类对象使用
return *d;
}
释放堆上空间用一个来接收 Base &b=func1();
然后释放他 Delete &b;
3⃣️父类指针指向子类对象
(1)用子类对象的地址初始化父类指针
Base b1(10);
Derived d1(1,2);
Base *p=&d1;
p->print(); // 调用的是父类的成员函数
p依然是一个父类对象的指针,不能调用子类扩展的成员函数,父类对象的地址不可以赋值给自乐对象
(2)函数形参是父类指针,而实参是子类对象地址
void func(Base *b){}
Base b1(1);
Derived d1(10,20);
func(&d1); // 实参是子类对象地址,子类对象当成父类对象使用
(3)函数返回值类型是父类指针,返回值为一个子类对象的地址
Base* func3(){
Derived *d=new Derived(10,20);// 子类对象当成父类对象使用
return d;
}
func3()->print();
释放堆上空间用一个来接收 Base &b=func1();
然后释放他 Delete &b;
注意:1⃣️=左边永远是父类,赋值完成后,=左边依然是父类
2⃣️可以把子类对象当父类对象使用,但是不可以把父类对象当成子类对象使用
3⃣️赋值完成后,父类对象指针引用不可以调用子类扩展的成员函数
子类对象当父类对象使用:关于拷贝构造函数时出现
(1)用已经存在的子对象初始化父类对象
Derived d1(10,20);
Base b1(d1); // 调用父类的拷贝构造函数
(2)函数形参是父类对象,形参是子类对象
void func(Base b){}// Base b=d1; 调用父类的拷贝构造函数
Derived d1(1,2);
func(b);
(3)函数返回值类型为父类对象,实际返回值为子类对象
Base func(){
Derived d1(1,2);
return d;
}

向下转型:
如果父类指针指向子类对象地址,如果想通过父类指针调用子类扩展的成员函数,需要把父类指针强制转换成子类指针
Base b1(10);
Derived d1(1,2);
Base *p=&d1;
p->print(); // 调用父类成员函数
((Derived*)p)->print(); // 把父类指针强制转换成子类指针 调用子类成员函数
强制类型的向下转型是一个不安全的转型方式,原因是父类指针在转换成子类指针时,辨别不出来自己是否转型成功,不报错。(多继承无能为力)

子类中的构造函数,析构函数。拷贝构造函数
1.构造函数:调用父类的普通构造函数,完成继承自父类部分成员的初始化
2.拷贝构造函数:调用父类的拷贝构造函数,完成继承自父类部分成员的初始化
先调用父类的构造函数,后调用子类的构造函数
3.子类的析构函数
子类只负责释放自己扩展的成员,父类部分;当子类析构完成,自动调用父类的析构函数来释放继承自父类的析构函数
先调用子类的析构函数,在调用父类的析构函数
4.赋值运算符重载:
继承自父类部分由父类的赋值运算符完成赋值,子类只需要完成自己扩展部分的赋值

转自:http://blog.csdn.net/zhanghow/article/details/52892227

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值