虚拟继承

虚拟继承
class   shape   {  
  public:  
            shape(int){}  
  };  
   
  class   circle:   public   shape   {  
  public:  
          circle(int):   shape(1){}  
  };  
   
  class   square:   public   shape   {  
  public:  
          square(int):   shape(1){}  
  };  
   
  class   bizzare:   public   circle,   public   square   {  
  public:  
          bizzare():   circle(1),   square(1){}  
  };  
  这里用的就是一般的多重继承,没有虚拟继承的存在。在bizzare(之所以叫这个名字,因为……从circle和square继承而来实在是够怪异的了,呵呵)类的member   initialization   list中,只需要写circle和square类的构造函数就可以了,后两者再分别调用它们的基类shape(分别的两个实例)的构造函数。  
   
  而如果是虚拟继承:  
  class   shape   {  
  public:  
            shape(int){}  
  };  
   
  class   circle:   public   virtual   shape   {  
  public:  
          circle(int):   shape(1){}  
  };  
   
  class   square:   public   virtual   shape   {  
  public:  
          square(int):   shape(1){}  
  };  
   
  class   bizzare:   public   circle,   public   square   {  
  public:  
          bizzare():   circle(1),   square(1),   shape(1){}  
  };  
  则必须在most   derived的派生类中初始化虚拟基类。  
   
  TC++PL上肯定有说的,在class   hierarchy那章。




这是语言规定。因为只有一个sharp对象,从哪个基类构造都有问题(因为它们可能调用虚基类的不同构造函数,产生二义性),所以标准规定必须在most   derived构造时显式或隐式(虚基类有缺省构造函数时)构造虚基类。楼主的例子里sharp没有缺省构造函数,所以必须显式构造。  
  TC++PL里有:  
  The   constructor   of   a   virtual   base   is   invoked   (implicitly   or   explicitly)   from   the   constructor   for   the   complete   object   (the   constructor   for   the   most   derived   class).


虚拟继承:发生在多重继承上,比如:一个类继承两类,但是这两个类都继承一个类。(类图出现环),即“孙子”到“爷爷”的 路径 超过一条时,使用,要不会有两个“爷爷”  
   
  虚函数:与继承完成多态工作。是面向对象关键中的关键。由于面向对象的设计是自顶向下的,先功能定义在实现。继承主要有实现继承和接口继承,都需要多态  

你可能感兴趣的:(虚拟继承)