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.赋值运算符重载:

继承自父类部分由父类的赋值运算符完成赋值,子类只需要完成自己扩展部分的赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值