According to the C++ spec, yes.
You need to declare the destructor virtual because otherwise, later
IMyInterface * ptr = getARealOne();
delete ptr;
won't call the destructor on the derived class (because the destructor isn't in the VTable)
It needs to be non-pure because base class destructors are always called by the sub-class destructor.
To further explain, C++ doesn't have a concept of an interface in the same way that Java or C# do. It's just a convention to use only pure-virtual methods, and think of that as an interface. The other rules about C++ destructors make it need to be non-pure, which breaks the similarity to interfaces in other languages, but those languages didn't exist at the time these rules were made.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…