0628第五讲继承(2)子类->父类
1、子类对象当作父类对象使用
* 子类对象赋值给父类对象、引用、指针时,父类对象、引用、指针依然是父类,当通过父类引用去调用被子类覆盖的函数时,还是调用父类版本的函数
* 不能调用子类扩展的成员
1.1子类对象直接复制给父类对象:仅仅是把继承自父类部分成员读取进行赋值
1.2父类引用指向子类对象:
父类函数被重写后父类对象还是调用自己的函数,父类引用不能调用子类扩展函数
1)子类对象初始化父类引用
2)函数形參是一个父类引用、实參是一个子类对象
3)函数原型返回值为父类引用,返回值是一个子类对象
1.3父类指针指向子类对象
1)子类对象初始化父类对象
2)函数形參是一个父类指针、实參是一个子类对象地址
3)函数原型返回值为父类指针,但返回值为一个子类对象地址
1.3拷贝构造函数
1)使用子类对象直接创建父类对象
2)函数参数是父类对象,实參时一个子类对象
3)函数原型返回值是父类对象,但返回值是一个子类对象
Base(const Base& b){
cout<<“调用父类拷贝构造函数”<<endl;
}
Derived(const Derived &d):Base(d){
cout<<“调用子类拷贝构造函数”<<endl;
Base b(100);
Derived d(1,2);
Base bc (b);//调用父类拷贝构造函数
Base bd(d);//调用父类拷贝构造函数
1.4子类对象可以当成父类对象使用、但是父类对象不可以当成子类对象来使用
强制转换:向下转换(不被使用、不安全(编译器不能确定转型是否成功))->dynamic_cast<>()
eg:
((Derived*)pb)->funcd();
4、子类中的构造函数、析构函数
{Derived d(10,20);}
父类的构造函数 b
子类的构造函数 d
子类的析构函数 ~d
父类的析构函数 ~b
1.1构造函数:派生类创建时会调用积累构造函数构造基类部分,然后再构造自己扩展的空间
1.2析构函数:子类对象销毁时,先调用子类析构函数,来时释放扩展的指针堆空间,再自动调用父类析构函数,来释放继承自父类部分指针的堆空间(子类只需要释放自己扩展的空间,继承部分默认由父类完成)
1.3拷贝构造函数:先调用父类拷贝构造函数(把继承自父类部分先进行赋值),再完成子类扩展部分内容的赋值。
Derived(const Derived &d):Base(d){
cout<<“子类拷贝构造函数”<