Check boost::is_base_of. And if you want to make it yourself try Alexyey's code from this question: 
typedef char (&yes)[1];
typedef char (&no)[2];
template <typename B, typename D>
struct Host
{
  operator B*() const;
  operator D*();
};
template <typename B, typename D>
struct is_base_of
{
  template <typename T> 
  static yes check(D*, T);
  static no check(B*, int);
  static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};
Edit. Writing static assert is not a big deal, but here it is:
#define STATIC_ASSERT(expr, msg) \
  { stat_assert<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; } 
template<int>
struct stat_assert;
template<>
struct stat_assert<true>{};
Edit2. And the whole working thing if you don't know how to merge these things: Code on ideone