文档详情

同名隐藏规则,虚基类C++类型兼容规则.docx

发布:2017-07-07约2.38千字共3页下载文档
文本预览下载声明
类型兼容规则同名隐藏规则虚基类虚函数一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以被赋值给基类对象;可以初始化基类的引用。指向基类的指针也可以指向派生类。通过基类对象名、指针只能使用从基类继承的成员当派生类与基类中有相同成员时:若未强行指名,则通过派生类对象使用的是派生类中的同名成员。如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定作用主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝注意:在第一级继承时就要将共同基类设计为虚基类。是非静态的成员函数。lvirtual只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。本质:不是重载声明而是覆盖。调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。#include iostreamusing namespace std;class B0 //基类B0声明{ public:void display(){coutB0::display()endl;}//公有成员函数};class B1: public B0 { public:void display(){coutB1::display()endl;} };class D1: public B1 {public:void display(){coutD1::display()endl;} };void fun(B0 *ptr) {ptr-display();//对象指针-成员名 }#include iostreamusing namespace std;class B1 //声明基类B1{ public: //外部接口intnV;void fun() {coutMemberof B1endl;}};class B2 //声明基类B2{ public: //外部接口intnV;void fun(){coutMemberof B2endl;}};class D1: public B1, public B2{ public:intnV; //同名数据成员void fun(){coutMemberof D1endl;} //同名函数成员};#include iostreamusing namecpacestd;class B0//声明基类B0{ public: //外部接口intnV;void fun(){coutMemberof B0endl;}};classB1:virtualpublicB0//B0为虚基类,派生B1类{ public: //新增外部接口int nV1;};classB2: virtualpublicB0//B0为虚基类,派生B2类{ public: //新增外部接口int nV2;};$ ~#include iostreamusing namespace std;class B0 //基类B0声明{public: //外部接口virtual void display()//虚成员函数{coutB0::display()endl;}};class B1: public B0 //公有派生{ public:void display(){coutB1::display()endl; }};class D1: public B1 //公有派生{ public:void display(){coutD1::display()endl; }};void fun(B0 *ptr) //普通函数{ ptr-display();}int main() //主函数{B0 b0; //声明B0类对象B1 b1; //声明B1类对象D1 d1; //声明D1类对象B0 *p; //声明B0类指针p=b0; //B0类指针指向B0类对象 fun(p);p=b1; //B0类指针指向B1类对象 fun(p);p=d1; //B0类指针指向D1类对象 fun(p);}int main(){D1 d1;d1.nV=1; //对象名.成员名标识, 访问D1类成员d1.fun(); d1.B1::nV=2; // 访问基类B1成员d1.B1::fun(); d1.B2::nV=3; //访问基类B2成员d1.B2::fun(); }int main() //程序主函数{ D1 d1; //声明D1类对象d1d1
显示全部
相似文档