有关虚基类和虚函数
虚基类是什么?什么时候要用到虚基类?虚函数又是啥?为什么有时候在继承和派生中必须要用到虚基类和虚函数?还有申请动态内存的代码怎么写?析构函数要怎么写?没有申请动态内存的析...
虚基类是什么?什么时候要用到虚基类?虚函数又是啥?为什么有时候在继承和派生中必须要用到虚基类和虚函数?还有申请动态内存的代码怎么写?析构函数要怎么写?没有申请动态内存的析构函数怎么写?本人菜鸟一个,对编程毫无基础,大一刚学C++一个多月,望高手们能解答详细易懂一点。给追加分呐~~~~~
展开
展开全部
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为 虚基类
虚基类. 在继承中产生歧义的原因有可能是继承类继承了基类多次,从而产生了多个拷贝,即不止一次的通过多个路径继承类在内存中创建了基类成员的多份拷贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。
用virtual限定符把基类继承说明为虚拟的。
classx1:virtual public x { //…… };
classx2:virtual public x { //…… };
在派生类继承基类时,加上一个virtual关键词则为虚拟基类继承,
如: classderive:virtual public base { };
虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如:classB { };
classD1:public B { };
classD2:public B { };
classC:public D1,public D2 { };
这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即:
classB { };
classD1:virtual public B { };
classD2:virtualpublicB { };
classC:public D1,public D2
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:
virtual 函数返回值类型 虚函数名(形参表) { 函数体 }
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。 当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。
虚函数的实例
#include<iostream.h>
class Cshape
{ public:
void SetColor( int color) { m_nColor=color;}
void virtual Display( void) { cout<<"Cshape"<<endl; }
private:
int m_nColor;
};
class Crectangle: public Cshape
{ public:
void virtual Display( void) { cout<<"Crectangle"<<endl; }
};
class Ctriangle: public Cshape
{ void virtual Display( void) { cout<<"Ctriangle"<<endl; } };
class Cellipse :public Cshape
{ public: void virtual Display(void) { cout<<"Cellipse"<<endl;} };
void main()
{ Cshape obShape;
Cellipse obEllipse;
Ctriangle obTriangle;
Crectangle obRectangle;
Cshape * pShape[4]= { &obShape, &obEllipse,&obTriangle, & obRectangle };
for( int I= 0; I< 4; I++) pShape[I]->Display( );
}
本程序运行结果:
Cshape
Cellipse
Ctriangle
Crectangle
以整型指针为例:int *p=new int;
析构函数加上:
delete p;
虚基类. 在继承中产生歧义的原因有可能是继承类继承了基类多次,从而产生了多个拷贝,即不止一次的通过多个路径继承类在内存中创建了基类成员的多份拷贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。
用virtual限定符把基类继承说明为虚拟的。
classx1:virtual public x { //…… };
classx2:virtual public x { //…… };
在派生类继承基类时,加上一个virtual关键词则为虚拟基类继承,
如: classderive:virtual public base { };
虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如:classB { };
classD1:public B { };
classD2:public B { };
classC:public D1,public D2 { };
这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即:
classB { };
classD1:virtual public B { };
classD2:virtualpublicB { };
classC:public D1,public D2
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:
virtual 函数返回值类型 虚函数名(形参表) { 函数体 }
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。 当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。
虚函数的实例
#include<iostream.h>
class Cshape
{ public:
void SetColor( int color) { m_nColor=color;}
void virtual Display( void) { cout<<"Cshape"<<endl; }
private:
int m_nColor;
};
class Crectangle: public Cshape
{ public:
void virtual Display( void) { cout<<"Crectangle"<<endl; }
};
class Ctriangle: public Cshape
{ void virtual Display( void) { cout<<"Ctriangle"<<endl; } };
class Cellipse :public Cshape
{ public: void virtual Display(void) { cout<<"Cellipse"<<endl;} };
void main()
{ Cshape obShape;
Cellipse obEllipse;
Ctriangle obTriangle;
Crectangle obRectangle;
Cshape * pShape[4]= { &obShape, &obEllipse,&obTriangle, & obRectangle };
for( int I= 0; I< 4; I++) pShape[I]->Display( );
}
本程序运行结果:
Cshape
Cellipse
Ctriangle
Crectangle
以整型指针为例:int *p=new int;
析构函数加上:
delete p;
中智咨询
2024-08-28 广告
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。...
点击进入详情页
本回答由中智咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询