欢迎来到天天文库
浏览记录
ID:50410712
大小:30.36 KB
页数:3页
时间:2020-03-08
《同名隐藏规则,虚基类C类型兼容规则.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、类型兼容规则同名隐藏规则虚基类虚函数一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以被赋值给基类对象;可以初始化基类的引用。指向基类的指针也可以指向派生类。通过基类对象名、指针只能使用从基类继承的成员当派生类与基类中有相同成员时:若未强行指名,则通过派生类对象使用的是派生类中的同名成员。如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定作用主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝注意:在第一级继承时就要将共
2、同基类设计为虚基类。是非静态的成员函数。lvirtual只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。本质:不是重载声明而是覆盖。调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。#includeusingnamespacestd;classB0//基类B0声明{public:voiddisplay(){cout<<"B0::display()"<3、{public:voiddisplay(){cout<<"B1::display()"<<#includeusingnamespacestd;classB1//声明基类B1{public://外部接口intnV;voidfun(){cout<<"MemberofB1"<usingnamecpacestd;classB0//声明基类B0{public://外部接口intnV;voidfun(){cout<<"MemberofB0"<4、l;}};classB1:virtualpublicB0#includeusingnamespacestd;classB0//基类B0声明{public://外部接口virtualvoiddisplay()//虚成员函数{cout<<"B0::display()"<5、oidfun(B0*ptr){ptr->display();//"对象指针->成员名"}{public://外部接口intnV;voidfun(){cout<<"MemberofB2"<6、ublic://新增外部接口intnV2;};$~{cout<<"B1::display()"<display();}intmain()//主函数{B0b0;//声明B0类对象B1b1;//声明B1类对象D1d1;//声明D1类对象intmain(){D1d1;d1.nV=1;//对象名.成员名标识,访问D1类成员d1.f7、un();intmain()//程序主函数{D1d1;//声明D1类对象d1d1.nV=2;//使用最远基类成员d1.fun();intmain()//主函数{B0b0,*p;//声明基类对象和指针B1b1;//声明派生类对象D1d1;//声明派生类B0*p;//声明B0类指针p=&b0;//B0类指针指向B0类对象fun(p);p=&b1;//B0类指针指向B1类对象fun(p);p=&d1;//B0类指针指向D1类对象fun(p);}d1.B1::nV=2;//访问基类B1成员d1.B1::fun();d1.B2::nV=3;//访问基8、类B2成员d1.B2::fun();}}对象p=&b0;fun(p);//调用基类B0函数成员p=&b1;fun(p);//调用B1函数成员p=&d1;fun(p);//调用D1
3、{public:voiddisplay(){cout<<"B1::display()"<<#includeusingnamespacestd;classB1//声明基类B1{public://外部接口intnV;voidfun(){cout<<"MemberofB1"<usingnamecpacestd;classB0//声明基类B0{public://外部接口intnV;voidfun(){cout<<"MemberofB0"<4、l;}};classB1:virtualpublicB0#includeusingnamespacestd;classB0//基类B0声明{public://外部接口virtualvoiddisplay()//虚成员函数{cout<<"B0::display()"<5、oidfun(B0*ptr){ptr->display();//"对象指针->成员名"}{public://外部接口intnV;voidfun(){cout<<"MemberofB2"<6、ublic://新增外部接口intnV2;};$~{cout<<"B1::display()"<display();}intmain()//主函数{B0b0;//声明B0类对象B1b1;//声明B1类对象D1d1;//声明D1类对象intmain(){D1d1;d1.nV=1;//对象名.成员名标识,访问D1类成员d1.f7、un();intmain()//程序主函数{D1d1;//声明D1类对象d1d1.nV=2;//使用最远基类成员d1.fun();intmain()//主函数{B0b0,*p;//声明基类对象和指针B1b1;//声明派生类对象D1d1;//声明派生类B0*p;//声明B0类指针p=&b0;//B0类指针指向B0类对象fun(p);p=&b1;//B0类指针指向B1类对象fun(p);p=&d1;//B0类指针指向D1类对象fun(p);}d1.B1::nV=2;//访问基类B1成员d1.B1::fun();d1.B2::nV=3;//访问基8、类B2成员d1.B2::fun();}}对象p=&b0;fun(p);//调用基类B0函数成员p=&b1;fun(p);//调用B1函数成员p=&d1;fun(p);//调用D1
4、l;}};classB1:virtualpublicB0#includeusingnamespacestd;classB0//基类B0声明{public://外部接口virtualvoiddisplay()//虚成员函数{cout<<"B0::display()"<5、oidfun(B0*ptr){ptr->display();//"对象指针->成员名"}{public://外部接口intnV;voidfun(){cout<<"MemberofB2"<6、ublic://新增外部接口intnV2;};$~{cout<<"B1::display()"<display();}intmain()//主函数{B0b0;//声明B0类对象B1b1;//声明B1类对象D1d1;//声明D1类对象intmain(){D1d1;d1.nV=1;//对象名.成员名标识,访问D1类成员d1.f7、un();intmain()//程序主函数{D1d1;//声明D1类对象d1d1.nV=2;//使用最远基类成员d1.fun();intmain()//主函数{B0b0,*p;//声明基类对象和指针B1b1;//声明派生类对象D1d1;//声明派生类B0*p;//声明B0类指针p=&b0;//B0类指针指向B0类对象fun(p);p=&b1;//B0类指针指向B1类对象fun(p);p=&d1;//B0类指针指向D1类对象fun(p);}d1.B1::nV=2;//访问基类B1成员d1.B1::fun();d1.B2::nV=3;//访问基8、类B2成员d1.B2::fun();}}对象p=&b0;fun(p);//调用基类B0函数成员p=&b1;fun(p);//调用B1函数成员p=&d1;fun(p);//调用D1
5、oidfun(B0*ptr){ptr->display();//"对象指针->成员名"}{public://外部接口intnV;voidfun(){cout<<"MemberofB2"<6、ublic://新增外部接口intnV2;};$~{cout<<"B1::display()"<display();}intmain()//主函数{B0b0;//声明B0类对象B1b1;//声明B1类对象D1d1;//声明D1类对象intmain(){D1d1;d1.nV=1;//对象名.成员名标识,访问D1类成员d1.f7、un();intmain()//程序主函数{D1d1;//声明D1类对象d1d1.nV=2;//使用最远基类成员d1.fun();intmain()//主函数{B0b0,*p;//声明基类对象和指针B1b1;//声明派生类对象D1d1;//声明派生类B0*p;//声明B0类指针p=&b0;//B0类指针指向B0类对象fun(p);p=&b1;//B0类指针指向B1类对象fun(p);p=&d1;//B0类指针指向D1类对象fun(p);}d1.B1::nV=2;//访问基类B1成员d1.B1::fun();d1.B2::nV=3;//访问基8、类B2成员d1.B2::fun();}}对象p=&b0;fun(p);//调用基类B0函数成员p=&b1;fun(p);//调用B1函数成员p=&d1;fun(p);//调用D1
6、ublic://新增外部接口intnV2;};$~{cout<<"B1::display()"<display();}intmain()//主函数{B0b0;//声明B0类对象B1b1;//声明B1类对象D1d1;//声明D1类对象intmain(){D1d1;d1.nV=1;//对象名.成员名标识,访问D1类成员d1.f
7、un();intmain()//程序主函数{D1d1;//声明D1类对象d1d1.nV=2;//使用最远基类成员d1.fun();intmain()//主函数{B0b0,*p;//声明基类对象和指针B1b1;//声明派生类对象D1d1;//声明派生类B0*p;//声明B0类指针p=&b0;//B0类指针指向B0类对象fun(p);p=&b1;//B0类指针指向B1类对象fun(p);p=&d1;//B0类指针指向D1类对象fun(p);}d1.B1::nV=2;//访问基类B1成员d1.B1::fun();d1.B2::nV=3;//访问基
8、类B2成员d1.B2::fun();}}对象p=&b0;fun(p);//调用基类B0函数成员p=&b1;fun(p);//调用B1函数成员p=&d1;fun(p);//调用D1
此文档下载收益归作者所有