[PyQt] SIP Bug: virtual function wrapped twice due to deep inheritance from base class and ABC

Demetrius Cassidy dcassidy36 at mass.rr.com
Fri Jul 2 14:49:59 BST 2010


Sorry Phil - corrected inheritance tree:

PUDPSocket <- PIPDataGramSocket <- PIPSocket <- PSocket (ABC) 
PTCPSocket <- PIPSocket <- PSocket (ABC)

PUDPSocket does not have a 'Listen' function in it, instead it just inherits
it from PIPSocket, who overrides PSocket. 

PTCPSocket DOES include a 'Listen' function in it, and overrides it from
PIPSocket and PSocket.

I've attached the corresponding sip files and the generated .cpp files from
sip. 

Below I've also included a snippet of the generated code for both classes.
The weird thing is that SIP wraps the PIPSocket Listen function, along with
the one from PSocket. http://old.nabble.com/file/p29056623/ptlib.rar
ptlib.rar 


class sipPUDPSocket : public PUDPSocket
{
public:
    ....

    /*
     * There is a protected method for every virtual method visible from
     * this class.
     */
protected:
    ...
    PBoolean Listen(unsigned,WORD,PIPSocket::Reusability);
    PBoolean Listen(const
PIPSocket::Address&,unsigned,WORD,PIPSocket::Reusability);
    ...
    PBoolean Listen(unsigned,WORD,PSocket::Reusability);
}

class sipPTCPSocket : public PTCPSocket
{
public:
    ...
    /*
     * There is a protected method for every virtual method visible from
     * this class.
     */
protected:
    PBoolean Listen(unsigned,WORD,PIPSocket::Reusability);
    PBoolean Listen(const
PIPSocket::Address&,unsigned,WORD,PIPSocket::Reusability);
    ...
    PBoolean Listen(unsigned,WORD,PSocket::Reusability);
};

Both classes share the same exact inheritance bug when wrapped:

Phil Thompson-5 wrote:
> 
> On Thu, 1 Jul 2010 17:53:23 -0700 (PDT), Demetrius Cassidy
> <dcassidy36 at mass.rr.com> wrote:
>> Phil,
>> 
>> It's not code specific to that class. It's due to the deep inheritance
>> tree.
>> You should be able to run my test code and get the same results.
>> 
>> Basically to sum it up:
>> 
>> PTCPSocket  <- PIPDataGramSocket <- PIPSocket <- PSocket (ABC)
>> 
>> PTCPSocket, PIPSocket and PSocket all define a virtual function called
>> 'Listen'.
>> Commenting 'Listen' out from PSocket, and SIP does not include the
> function
>> twice.
>> Listen is NOT a pure virtual function in the ABC, it has a body.
>> Listen is fully defined in PTCPSocket, and the other classes except
>> PIPDataGramSocket.
> 
> The error appears in PUDPSocket but you don't even mention that class.
> Where does it fit in the inheritance tree?
> 
> Phil
> 
> 
>> Phil Thompson-5 wrote:
>>> 
>>> On Sat, 19 Jun 2010 10:27:55 -0700 (PDT), Demetrius Cassidy
>>> <dcassidy36 at mass.rr.com> wrote:
>>>> Basically I have a Listen() function in a derived class, that is also
> in
>>>> the 
>>>> base and ABC. For some reason sip ends up wrapping the same function
>>> twice
>>>> (it 
>>>> has a body in the ABC), even though it's a virtual function in all of
>>>> the
>>> 
>>>> derived classes. If I comment out this function in the ABC, everything
>>>> works 
>>>> fine, but otherwise I get a C2535 compiler error with Visual C++. 
>>>>  
>>>> Here is what sip comes up with: 
>>>>  
>>>> class sipPUDPSocket : public PUDPSocket 
>>>> { 
>>>>  
>>>>     /* 
>>>>      * There is a protected method for every virtual method visible
> from
>>>>
>>>>      * this class. 
>>>>      */ 
>>>>  protected: 
>>>>     PBoolean Listen(unsigned,WORD,PIPSocket::Reusability); 
>>>>     /*more wrapped functions*/ 
>>>>     PBoolean Listen(unsigned,WORD,PIPSocket::Reusability); // <--
>>> duplicate
>>>> function 
>>>> }; 
>>>>  
>>>> C++ nmake errors: 
>>>>  
>>>> sippyptlibPTCPSocket.cpp 
>>>> .\sippyptlibPTCPSocket.cpp(121) : error C2535: 'PBoolean 
>>>> sipPTCPSocket::Listen(unsigned int,WORD,PSocket::Reusability)' 
>>>> : member function already defined or declared 
>>>>         .\sippyptlibPTCPSocket.cpp(102) : see declaration of 
>>>> 'sipPTCPSocket::Listen' 
>>>>  
>>>>  
>>>> .\sippyptlibPTCPSocket.cpp(506) : error C2084: function 'PBoolean
>>>> sipPTCPSocket: 
>>>> :Listen(unsigned int,WORD,PSocket::Reusability)' already has a body 
>>>>         .\sippyptlibPTCPSocket.cpp(102) : see previous definition of
>>>> 'Listen' 
>>>>  
>>>>  
>>>> Basic code structure based on what I am wrapping - note that I only
>>>> included
>>>> the 
>>>> offending function here, as it would be too much code to include
>>>> everything. 
>>> 
>>> But you at least need to include the definition of PUDPSocket.
>>> 
>>>> typedef bool PBoolean; 
>>>>  
>>>> class PTCPSocket : PIPDataGramSocket 
>>>> { 
>>>>  public: 
>>>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); 
>>>> } 
>>>>  
>>>> class PIPDataGramSocket : PIPSocket 
>>>> { 
>>>>   protected: 
>>>>     PIPDataGramSocket(); 
>>>> } 
>>>>  
>>>> class PIPSocket : PSocket 
>>>> { 
>>>>  public: 
>>>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); 
>>>> } 
>>>>  
>>>> class PSocket /Abstract/ 
>>>> { 
>>>>   public: 
>>>>     /// Flags to reuse of port numbers in Listen() function. 
>>>>     enum Reusability { 
>>>>       CanReuseAddress, 
>>>>       AddressIsExclusive 
>>>>     }; 
>>>>  
>>>>   virtual PBoolean Listen(unsigned int, WORD, PSocket::Reusability); //
> 
>>>> commenting this function out fixes this problem 
>>>>  
>>>>  protected: 
>>>>     /*This function calls os_socket() with the correct parameters for
>>>>     the
>>> 
>>>>        socket protocol type. 
>>>>      */ 
>>>>     virtual PBoolean OpenSocket() = 0; 
>>>>  
>>>> }; 
>>> 
>>> Phil
>>> _______________________________________________
>>> PyQt mailing list    PyQt at riverbankcomputing.com
>>> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>>> 
>>>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> 
> 

-- 
View this message in context: http://old.nabble.com/SIP-Bug%3A-virtual-function-wrapped-twice-due-to-deep-inheritance-from-base-class-and-ABC-tp28936011p29056623.html
Sent from the PyQt mailing list archive at Nabble.com.



More information about the PyQt mailing list