派生类对象间的赋值操作依据下面的原则:
另一方面,基类对象和派生类对象之间允许有下述的赋值关系(允许将派生类对象“当作”基类对象来使用):
只赋“共性成员”部分 ,反方向的下述赋值不被允许
下述赋值不允许:指向派生类类型的指针 =基类对象的地址。注:访问非基类成员部分时,要经过指针类型的强制转换
下述赋值不允许:派生类的引用 = 基类对象。
注:通过引用只可以访问基类成员部分
#include<iostream.h>
class base{ //基类base
int a;
public:
base (intsa) {a=sa;}
intgeta(){return a;} };
classderived:publicbase { //派生类derived
int b;
public:
derived(intsa, intsb):base(sa){b=sb;}
int getb (){return b;}voidmain () {
base bs1(123); // base 类对象bs1
cout<<"bs1.geta()="<<bs1.geta()<<endl;
derived der(246,468); // derived 类对象der
bs1=der; //OK! “基类对象=派生类对象;”
cout<<"bs1.geta()="<<bs1.geta()<<endl;
//der=bs1; //ERROR! “派生类对象 = 基类对象;”
base *pb= &der;
//“指向基类型的指针=派生类对象的地址;”
cout<<"pb->geta()="<<pb->geta()<<endl;
//访问基类成员部分
//cout<<pb->getb()<<endl;
//ERROR! 直接访问非基类成员部分
cout<<"((derived*)pb)->getb()="<<((derived *)pb)->getb()<<endl;
//访问非基类成员部分时,要经过指针类型的强制转换
//derived *pd= &bs1; //ERROR! “指向派生类类型的指针=基类对象的地址;” }
程序执行后的显示结果如下:
bs1.geta()=123
bs1.geta()=246
pb->geta()=246
((derived*)pb)->getb()=468