4.5 基类与派生类对象之间的赋值兼容关系
【定义】不同类型数据之间的自动转换和赋值,称之为赋值兼容
【基类与派生类对象之间的赋值兼容关系】需要基类对象的任何地方,都可以使用公有派生类对象替代。
【替代的四种情况】
说明:Base为基类,Derived为公有派生类
(1)派生类对象可以向基类对象赋值
Base b;
Derived d;
b=d; //用派生类对象d对基类对象b赋值
(2)派生类对象可以初始化基类对象的引用
Base b;
Derived d;
Base &br=d; //定义基类Base的对象的引用br,再用用派生类Derived对象d对基类对象b赋值
(3)派生类对象的地址可以赋给指向基类对象的指针
Derived d;
Base *b=&d; //把派生类对象的地址&d赋值给指向基类的指针bp
//也就是说指向基类对象的指针bp也可以指向派生类对象d
(4)如果函数的形参是基类对象或是基类对象的引用,在调用函数时可以用派生类对象作为实参。
.....
//形参为基类对象
void function(Base b){
//函数体
}
//形参为基类对象的引用
void function_reference(Base &b){
//函数体
}
int main(){
Derived d;
function(d);
function_reference(d);
}
【示例】
#include<iostream>
using namespace std;
class Base{
public:
Base(int sub_b){
b=sub_b;
}
void show(){
cout<<" Base-> b = "<<b<<endl;
cout<<"============================================"<<endl;
}
private:
int b;
};
class Derived:public Base{
public:
Derived(int sub_b,int sub_d):Base(sub_b){
d=sub_d;
}
void show(){
Base::show();
cout<<" Derived-> d = "<<d<<endl;
cout<<"============================================"<<endl;
}
private:
int d;
};
void function(Base b){
cout<<"=====形参为基类对象====="<<endl;
b.show();
}
void function_reference(Base &b){
cout<<"=====形参为基类对象的引用====="<<endl;
b.show();
}
int main()
{
Base op_b(10);
op_b.show();
Derived op_d(20,30);
op_d.show();
cout<<endl<<"=====基类与派生类对象之间的赋值兼容关系====="<<endl;
cout<<"=====(1)派生类对象对基类赋值====="<<endl;
op_b=op_d;
op_b.show();
cout<<"=====(2)派生类对象初始化基类对象的引用====="<<endl;
Base &br=op_d;
br.show();
cout<<"=====(3)派生类对象的地址赋给指向基类对象的指针====="<<endl;
Base *p=&op_d;
p->show();
cout<<"=====(4)函数的形参是基类对象或基类对象的引用====="<<endl;
function(op_d);
function_reference(op_d);
}
【运行结果】
【说明】
(1)声明为指向基类对象的指针可以指向它的公有派生类的对象,不允许指向它的私有派生类的对象
(2)允许将一个声明为指向基类的指针指向其公有派生类的对象,但不能将一个声明为指向派生类对象的指针指向其基类的一个对象