[PyKDE] sip: C++ virtual methods
    Patrick Stinson 
    ajole-1 at gci.net
       
    Mon Sep 22 07:14:01 BST 2003
    
    
  
I've been having a never-ending struggle with virtual methods. It seems that 
virtual methods wrapped by sip don't always work - that is they actually end 
up working like non-virtual functions. This isn't consistent, and I've never 
found a solution besides fiddling with it until the _same exact_ code ends up 
functioning differently after a number of print-out style debugging.
Consider this:
media = PK.CreateMediaLayer("./track.ogg")
while not media.AtEnd():
  media.Read()
All of these methods are C++ wrapped methods. PK::CreateMediaLayer() returns a 
PK_MediaLayer *, which may be an instance of either PK_WaveDecoder or 
PK_OggDecoder. All PK_Media:Layer methods are [not pure] virtual in sip and 
C++, are reimplemented in the respective subclasses, are are not inline.
In the above example, media.AtEnd() is supposed to call 
PK_OggDecoder::AtEnd(), but it really calls PK_MediaLayer::AtEnd(). Why is 
that? Are there certain caveats with C++ virtual functions that I have 
naively overlooked? What is the relationship to methods declared virtual in 
sip and those declared virtual in C++? Is virtual really needed in sip?
I hope Phil isn't the only person that will be able to answer these...
Thanks!
    
    
More information about the PyQt
mailing list