From: omveer.chaudhary@googlemail.com   
      
   Thanks to Tobias Müller. I got below response.   
      
    wrote:   
   > Hi,   
   >   
   > I'm trying below scenario:   
   > class xx   
   > {   
   > xx(){}   
   > friend class yy;   
   > };   
   >   
   > class yy: virtual public xx   
   > {   
   > public:   
   > yy(){}   
   > };   
   >   
   > class zz:public yy   
   > {   
   > public:   
   > };   
   >   
   > Q1: It doesn't work with ZZ obj; Please help me understanding it.   
      
   Your class zz implicitly has the following constructor:   
      
   class zz : public yy   
   {   
   public:   
    zz() : xx(), yy() {}   
   }   
      
   Constuctors of virtual base classes are called from every derived class   
   directly.   
      
   Consider the following case:   
      
   class A   
   {   
   public:   
    A();   
    A(int i);   
   };   
      
   class B : virtual public A   
   {   
   public:   
    B() : A() {}   
   };   
      
   class C : virtual public A   
   {   
   public:   
    C() : A(4) {}   
   };   
      
   class D : public B, public C   
   {   
   public:   
    // D() : B(), C() {} // -> Error, the A subobject   
    // is the same for B and C   
    // and can only be   
    // constructed once. But use   
    // A() or A(4)?   
    D() : A(), B(), C() {} // Correct   
   };   
      
   > class xx   
   > {   
   > xx(){}   
   > friend class yy;   
   > };   
   >   
   > class yy: public xx   
   > {   
   > public:   
   > yy(){}   
   > };   
   >   
   > class zz:public yy   
   > {   
   > public:   
   > };   
   >   
   > Q2: After removing virtual, it works for zz obj;. Why and how?   
   Your class zz implicitly has the following constructor:   
      
   class zz : public yy   
   {   
   public:   
    zz() : yy() {}   
   }   
      
   Constuctors of non-virtual base are only called from classes that inherit   
   directly.   
      
   Consider again the same case, but without virtual inheritance:   
      
   class A   
   {   
   public:   
    A();   
    A(int i);   
   };   
      
   class B : public A   
   {   
   public:   
    B() : A() {}   
   };   
      
   class C : public A   
   {   
   public:   
    C() : A(4) {}   
   };   
      
   class D : public B, public C   
   {   
   public:   
    D() : B(), C() {} // Correct: B and C have both   
    // their own A object and   
    // do the initialization on their own.   
    // D() : A(), B(), C() {} // Error   
   };   
      
      
   --   
    [ See http://www.gotw.ca/resources/clcm.htm for info about ]   
    [ comp.lang.c++.moderated. First time posters: Do this! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|