你想要的东西不能直接完成,正如其他人已经解释的那样。
但是,您仍然可以从界面开发人员那里获得一些您想要的行为。如果所有接口都来自公共基类Interface
,则可以在编译时使用类似于this question的技术来检查Interface
是否为基类。
例如:
class Interface {
public :
virtual ~Interface() { }
};
template <typename T>
struct IsDerivedFromInterface {
static T t();
static char check(const Interface&);
static char (&check(...))[2];
enum { valid = (sizeof(check(t())) == 1) };
};
class MyInterface : public Interface {
public :
virtual void foo() = 0;
};
class MyBase {
public :
virtual void bar() { }
};
class Foo : public MyInterface {
public :
virtual void foo() { }
};
BOOST_STATIC_ASSERT(IsDerivedFromInterface<Foo>::valid); // just fine
class Bar : public MyBase {
public :
virtual void bar() { }
};
BOOST_STATIC_ASSERT(IsDerivedFromInterface<Bar>::valid); // oops
当然,基类的开发者可以欺骗和从Interface
派生即使基类不是一个接口。这就是为什么我说它需要开发者的一些纪律。
尽管如此,我看不出这将如何有用。我从来没有觉得我需要这种编译时检查。
真的所有的方法纯虚拟?即使是析构函数? – Andrzej 2012-03-28 07:40:39
假设你想检查'T'是否具有基类,如果是,那么它们是否也是“接口”。但答案确实是“不”。 – MSalters 2012-03-28 07:55:03