【发布时间】:2015-10-23 04:30:13
【问题描述】:
我们的项目中有一个特殊的接口框架,部分要求是表示接口的类只能用作虚拟基类,不能用作非虚拟基类。有没有办法在代码中强制执行这一点?也就是说,如果类是从非虚拟派生的,则会产生编译错误。
我可以访问 VS 2010 实现的 C++11:这意味着 static_assert、enable_if 和 <type_traits> 可用。
【问题讨论】:
-
现在可能有更好的方法来做到这一点,但在 VS2010 中有一个 Microsoft 特定的关键字,称为
__interface。但是,这是 a) 不可移植 b) 您必须小心,因为出于某种原因,这些接口不允许有虚拟析构函数。 -
这听起来更像是技术规范而不是功能要求。为什么需要这个?
-
是否需要在编译时强制执行?您可以write a little tool using libclang 进行检查,并将其用作代码审查/构建过程的一部分。
-
如果一个类真的只是一个接口,即它没有方法实现或成员变量,那么它是否被虚拟继承并不重要。
-
@Clark 不正确。如果它是非虚拟继承的,则层次结构中可能有该类的两个实例,具有两个实现,并且转换为该接口可能导致对同一对象使用不同的方法。这可能是高度混乱和意外的行为。如果到处都是
virtual,那么任何实现方法的类都会在整个层次结构中实现它。
标签: c++ c++11 typetraits virtual-inheritance static-assert