我们有一个限制,一个类不能作为超过 7 个类的基类。有没有办法在编译时强制执行上述规则?
我知道 Andrew Koenig 的 Usable_Lock 技术可以防止类被继承,但只有当我们尝试实例化该类时它才会失败。自己推导时不能这样做吗?
允许基类知道谁是它的孩子。所以我想我们可以声明一个朋友类的组合并封装它们来执行这个规则。假设我们尝试这样的事情
class AA {
friend class BB;
private:
AA() {}
~AA() {}
};
class BB : public AA {
};
class CC : public AA
{};
类 CC 的派生将生成编译器警告 abt inaccessible dtor。然后,我们可以使用编译器调整将此类警告标记为错误(例如将所有警告标记为错误),但我不想依赖此类技术。
另一种方式,但在我看来相当笨拙的是: -
class B;
class InheritanceRule{
class A {
public:
A() {}
~A() {}
};
friend class B;
};
class B {
public:
class C : public InheritanceRule::A
{};
};
class D : public InheritanceRule::A{};
类 D 的派生将被标记为编译器错误,这意味着要派生的所有类都应在类 B 中派生。这将允许至少检查从类 A 派生的类的数量,但不会阻止任何人添加更多.
这里有人有办法吗?如果基类不需要知道谁是它的孩子,那就更好了。
注意:作为基类的类本身可以被实例化(它不是抽象的)。
提前致谢,
EDIT-1:根据 jon.h 的评论,稍作修改
// create a template class without a body, so all uses of it fail
template < typename D>
class AllowedInheritance;
class Derived; // forward declaration
// but allow Derived by explicit specialization
template<>
class AllowedInheritance< Derived> {};
template<class T>
class Base : private AllowedInheritance<T> {};
// privately inherit Derived from that explicit specialization
class Derived : public Base<Derived> {};
// Do the same with class Fail Error
// it has no explicit specialization, so it causes a compiler error
class Fail : public Base<Fail> {}; // this is error
int main()
{
Derived d;
return 0;
}