The problem is your use of non-virtual inheritance. With non-virtual inheritance a base class can be included multiple times in an inheritance hierarchy. For example your cStreamTexture inheritance hierarchy looks like:
cStreamTexture | | V VcTexture iStreamTexture | | V ViTexture iTexture
Now cStreamTexture inherits
two copies of iTexture. cTexture correctly overrides the pure virtual functions of one of those instances, but the pure virtual functions of the other instance are never overriden, causing cStreamTexture to be an abstract class.
By using virtual inheritance you resolve this problem and your inheritance hierarchy now looks like:
cStreamTexture | | V VcTexture iStreamTexture | | V V iTexture
You now only have one copy of iTexture and cTexture overrides the pure virtual functions contained within.
This is actually one of the (relatively) few cases where multiple inheritance is probably a good solution to a problem. I certainly don't know of any nice equivalent solutions without using multiple inheritance.
It is important to note that this is a simple case of multiple inheritance. Since iTexture and iStreamTexture are abstract base classes many of the problems with general multiple inheritance cannot arise. In fact this form of virtual inheritance is so safe even Java implements it, via interfaces (no offense to Java programmers [lol]).
Enigma