(一)背景引入
尽管派生类对象也是基类对象,但派生类类型和基类类型是不同的。在公用继承(public继承)中,派生类对象能作为基类对象处理。由于派生类具有对应每个基类成员的成员(派生类的成员通常比基类成员多),故派生类的对象赋给基类对象是合理的;但若将基类对象赋给派生类对象,会使派生类中独有(基类没有)的成员无定义,故这是不允许的!(除非强制类型转换)
(二)基类指针和派生类指针与基类对象和派生类对象的匹配的4种情况
(1)基类指针指向基类对象
(2)派生类指针指向派生类对象
(3)【常考】基类指针指向派生类对象。此种引用方式安全,但只能指向基类成员;不能访问基类没有,而派生类独有的成员!
(4)派生类指针指向基类对象。错误!除非派生类指针先强制转换为基类指针
·分别对应下面代码中的4种情况,其中3很常见,也是多态中的常见用法/考法
(三)极简代码实例
【极简模型实例】对应下面4种情况,已是最精简可运行代码
#include "bits/stdc++.h"
#include<iostream>
using namespace std;class A{public:void g(){cout<<"A的g"<<endl; }
};class B:public A{public:void g(){cout<<"B的g"<<endl; }void h(){cout<<"B的h"<<endl;}
};int main(){ A *p1=new A; //情况1:输出A的g p1->g();delete p1;B *p2=new B; //情况2:输出B的g p2->g(); delete p2;A *p3=new B; //情况3:输出A的g.基类指针指向派生类对象,此时只能引用基类成员,不能引用派生类成员 p3->g();
// p3->h(); //【注意】此时只能引用基类成员.即不能访问基类没有,而派生类独有的成员.报错 delete p3; // B *p4=new A//情况4:这样不行!报错!除非派生类指针强转为基类指针 return 0;
}