我們有一個限制,即一個類不能作爲超過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