たとえばIDを返すことを強要したい場合、以下のようにインターフェイスを設けるべきだと言われますが、
class IItem {
public:
  virtual ID GetID() const = 0;
  virtual ~IItem() {}
};

このような場合、分かりきっている実装は含めたほうがよくないでしょうか。
class IItem {
public:
  virtual ID GetID() const { return id; }
  virtual ~IItem() { id_.Release; }
protected:
  IItem(ID id) : id_(id) {}
private:
  ID id_;
};

また調べているうちにNVIパターンというものを知りました。
class IItem {
public:
  ID GetID() const { return DoGetID(); }
  virtual ~IItemA() {}
private:
  virtual ID DoGetID() const = 0;
};

他言語ではインターフェイスは純粋な仮想関数を含むクラスという制限がありますが
その制限のない、というかインターフェイスという概念のないC++において、実装を含むクラスをインターフェイスと呼べるのでしょうか。
またインターフェイスという仕様に沿うために、実装を完全に派生クラスに移譲する設計をしているのか、
基底クラスに実装を含めたほうがいいと考えられるようなものでも、あえてそうしない理由があるのか、教えてください。