小白教教你学习C++(3)虚基类函数

来源:互联网 发布:好听的淘宝客服名称 编辑:程序博客网 时间:2024/05/17 09:36

小白教教你学习C++(3)虚基类函数

为什么要定义虚基类?因为为了避免函数继承产生的二义性:详解如下:

HFWHFIAMLSDV 典型的需要用虚基类的情况如下: 

             A 

            / \ 

           B    C 

            \ / 

             D 

其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承 

程序嘛………… 


class A { 

   public: 

     void printA() {cout<<"this is A\n";} 

}; 

class B:virtual public A; 

class C:virtual public A; 

class D:public B,public C; 


这样在D构造出来后,它的存储区域中只有一个A,不会有二义性问题 

比如:D d=new D; 

此时若使用D.printA();不会有问题;但若B和C不是虚继承自A,就会有二义性问


虚基类应用举例

[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4. class Person  
  5. {  
  6. public:  
  7.     Person(char *nam,char s,int a) //构造函数  
  8.     {  
  9.         strcpy(name,nam);  
  10.         sex=s;  
  11.         age=a;  
  12.     }  
  13. protected:                  //保护成员  
  14.     char name[20];  
  15.     char sex;  
  16.     int age;  
  17. };  
  18.   
  19. class Teacher:virtual public Person //声明Person为公用继承的虚基类  
  20. {  
  21. public:  
  22.     Teacher(char *nam,char s,int a,char *t):Person(nam,s,a) //构造函数  
  23.     {  
  24.         strcpy(title,t);  
  25.     }  
  26. protected:        //保护成员  
  27.     char title[10];  
  28. }; //职称  
  29.   
  30. class Student:virtual public Person //声明Person为公用继承的虚基类  
  31. {  
  32. public:  
  33.     Student(char *nam,char s,int a,float sco): //构造函数  
  34.         Person(nam,s,a),score(sco) {}           //初始化表  
  35. protected:      //保护成员  
  36.     float score;  
  37. };//成绩  
  38.   
  39. class Graduate:public Teacher,public Student //声明Teacher和Student类为公用继承直接基类  
  40. {  
  41. public:  
  42.     Graduate(char *nam,char s,int a,char *t,float sco,float w): //构造函数  
  43.         Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w) {} //初始化表  
  44.     void show( ) //输出研究生的有关数据  
  45.     {  
  46.         cout<<"name:"<<name<<endl;  
  47.         cout<<"age:"<<age<<endl;  
  48.         cout<<"sex:"<<sex<<endl;  
  49.         cout<<"score:"<<score<<endl;  
  50.         cout<<"title:"<<title<<endl;  
  51.         cout<<"wages:"<<wage<<endl;  
  52.     }  
  53. private:  
  54.     float wage;  
  55. }; //工资  
  56.   
  57.   
  58. int main( )  
  59. {  
  60.     Graduate grad1("Wang-li",'f',24,"assistant",89.5,1234.5);  
  61.     grad1.show( );  
  62.     return 0;  
  63. }  

原创粉丝点击