关于虚基类~点点

猪女 发布于 2010/11/25 22:42
阅读 495
收藏 0

1.       虚基类 

虚基类说明格式:

   virtual  <继承方式>  <基类名>

其中,virtual是虚基类的关键字。虚基类的说明是用在定义派生类时,写在派生类名的后面。

派生类的构造函数的调用次序的原则:

·  虚基类的构造函数在非虚基类之前调用

·  若同一层次中包含多个虚基类,这些虚基类的构造函数按他们说明的次序调用

·  若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类中构造函数的执行顺序。

  

 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为

  

虚基类

虚基类.

在继承中产生歧义的原因有可能是继承类继承了基类多次,从而产生了多个拷贝,即不止一次的通过 多个路径继承类在内存中创建了基类成员的多份拷贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的,就只能继承基 类的一份拷贝,从而消除歧义。用virtual限定符把基类继承说明为虚拟的。

C++的虚基类

在派生类继承基类时,加上一个virtual关键词则为虚拟基类继承,如:

classderive:virtual public base

{

};

虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如:

classB

{

};

classD1:public B

{

};

classD2:public B

{

};

classC:public D1,public D2

{

};

这里CD1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即:

classB

{

};

classD1:virtual public B

{

};

classD2:virtualpublicB

{

};

classC:public D1,public D2

 

 

例如:

/*

设计一个虚基类base,包含姓名和年龄私有数据成员以及相关的成员函数,

由它派生出领导类leader,包含职务和部门私有数据成员,以及相关的成员函数。

再由base派生出工程师类engineer,包含职称和专业私有数据成员以及相关的成员函数。

然后由leaderengineer派生出主任工程师类chairman

最后采用一些数据测试。

*/

#include<iostream>

#include<string.h>

using namespace std;

class base

{

        char *name;

        int age;

public:

        base (){}

        void setname (char na[])

        {

                 name = new char[strlen(na)+1];

                 strcpy(name , na);

        }

        void setage(int a)

        {

                 age=a;

        }

        char *getname(){return name;}

        int getage() {return age;}

};

class leader : virtual public base //领导类

{

        char *job;

        char *department;

public :

        leader(){}

        void setjob(char jo[])

        {

                 job=new char [strlen(jo)+1];

                 strcpy(job, jo);

        }

        void setdepart(char dep[])

        {

                 department= new char [strlen(dep)+1];

                 department=dep;

        }

        char *getjob(){return job;}

        char *getdepart(){return department;}

};

 

class engineer : virtual public base

{

        char *prof;

        char *major;

public :

        engineer(){}

        void setprof(char pro[])

        {

                 prof=new char[strlen(pro)+1];

                 prof=pro;

        }

        void setmajor(char maj[])

        {

                 major=new char[strlen(maj)+1];

                 major=maj;

        }

        char *getprof(){ return prof;}

        char *getmajor(){return major;}

};

class chairman : public leader, public engineer//主任工程师类

{

};

 

void main ()

{

        chairman c;

        c.setname("天涯");

        c.setage(20);

        c.setjob("技术人员");

        c.setdepart("就业中心");

        c.setprof("网站管理员");

        c.setmajor("软件工程");

        cout<<"输出结果:"<<endl;

        cout<<"  "<<c.getname()<<",年龄"<<c.getage()

                 <<"岁,担任"<<c.getdepart()<<c.getjob()<<","<<endl;

        cout<<"  "<<c.getprof()<<",从事"<<c.getmajor()

                 <<"专业。"<<endl<<endl;

        getchar();//按任意键退出

 

}

输出结果:

天涯,年龄20岁,担任就业中心技术人员,

网站管理员,从事软件专业。

 

加载中
0
ddatsh
ddatsh

C++ 看的是黎培兴的视频教程

最近阶段准备深入研究PHP 和c++的东东

此回帖为证

虽然肯定马上就被埋了

0
也曾年轻过
也曾年轻过

咋这么别扭呢?这是虚继承吧。。

返回顶部
顶部