我们有一个限制,即一个类不能作为超过7个类的基类。 有没有办法在编译时强制执行上述规则?在编译时将继承限制为期望数量的类
我知道Andrew Koenig的Usable_Lock技术可以防止类被继承,但只有当我们尝试实例化类时它才会失败。这不能在派生自己的时候完成吗?
允许基类知道谁是它的子女。所以我想我们可以声明一个朋友 类的组合并封装它们来执行这个规则。假设我们尝试这样的事情
class AA {
friend class BB;
private:
AA() {}
~AA() {}
};
class BB : public AA {
};
class CC : public AA
{};
CC类的派生会生成一个编译器警告abt无法访问的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;
}
为什么选择7? – Shog9 2009-04-30 05:22:03
>注意:充当基类的类本身可以被实例化(它不是抽象的)。 等等,认真吗?你有一个关于子类的数量的任意规则,这没有任何可以想象的目的,但不是关于使抽象的基础,这是什么? – tpdi 2009-04-30 05:38:49
@ Shog9:我不知道为什么它只有7,它可能是我认为的任何数字。项目建筑师不喜欢nos> 7我猜:-) @tpdi:候选基类可能并不总是一个iterface。 老实说,我也不明白这背后的概念,除了放牧不驯的遗传承认程序员,但我会在稍后处理。目前我正在尝试查看是否有任何解决方案。 – Abhay 2009-04-30 05:43:28