home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c++.moderated      Moderated discussion of C++ superhackery      33,346 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 32,876 of 33,346   
   omveer to omveer.c...@gmail.com   
   Re: Virtual base class and friend   
   28 Feb 13 04:16:00   
   
   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)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca