These include for example the fact that template instantiation errors are not usually reported until link time. Since interface classes cannot be directly instantiated, yet serve as virtual base classes for implementations, the constructors should take no arguments and should be listed as protected . Depending on your compiler, you might need to define the no-op constructor and destructor operations outside the class declaration in a separate .C file. The use of const here and elsewhere has its ups and downs. Officially, it is a good idea, since it helps enforce some of the intended semantic guarantees.
Similar remarks hold, but moreso for exceptions.
Not listing any says implicitly that any exception may occur, thus requiring manual documentation about the ones that are likely. Public Virtual Inheritance Officially, subinterfaces should be declared as public virtual subclasses of all of their direct ancestors. The same hold true of the leaf concrete subclasses that implement interfaces. For most purposes public virtual inheritance ought to be considered the default subclassing mechanism. People often break this rule however.