Chapter 18 Large-scale project tools 大型項目

命名空間

inline命名空間

inline聲明的命名空間, 可以無視本層命名空間, 而可以被直接使用.

用處: 可以方便的變更版本, 如:

namespace libnet{
  #include <version5.h>
  #include <version4.h>
}

同時,

namespace libnet{
  **inline** namespace version5{
    ........
}
}

namespace libnet{
    namespace version4{
  ........
}
}

namespace使用的時候, libnet::默認(rèn)使用的就是version5, 除非手動指定libnet::version4::


全局的inline的命名空間內(nèi)的變量有可能導(dǎo)致和全局變量的命名沖突

如果實參中有一個是類, 那么編譯器就會在整個函數(shù)名, 所有實參及函數(shù)內(nèi)部默認(rèn)使用了這個類的命名空間.

operator << (std::cin, string s)

<<其實是std::<<
string其實是std::string


一個類, 在查找其可用的函數(shù)的時候, 不僅在自己的作用域找, 還去基類的成員函數(shù)找, 還去基類的作用域中找. 如

namespace NS{
  class Base{}
  void display(Base ..){}
}

class Derived:public Ns::Base{};
int main()
{
  Derived D;
  display(D); // 調(diào)用display的時候, 不僅在當(dāng)前作用域找, 還去基類的命名空間中查找
  return 0 ;
}

虛繼承

如果派生類D繼承自兩個不同的類d1, d2, 而恰好這兩個類都繼承自同一個類b, 那么??

因為在正常的繼承關(guān)系中, 這兩個類都持有各自的基類, 因此基類的成員會在D中有兩個. 阻止方法是將d1 d2的繼承方式聲明為virtual.

class d1:virtual public b;
class d2:virtual public b;

虛繼承聲明了自己持有的基類的成員愿意是與其他類"共享的"
虛基類的繼承關(guān)系是在項目組中一次性設(shè)計完成的, 后續(xù)獨立開發(fā)者并不需要改變原有開發(fā)好的類的虛的實現(xiàn). 一次性開發(fā)過程中, 聲明為虛繼承大多數(shù)也沒有什么壞處

可見性: 如果d1或者d2中重新聲明了一個b中存在的成員, 則在D中優(yōu)先使用d中的成員(因為距離最近 最優(yōu)), 如果兩個都沒聲明, 就用b中. 如果兩個都又聲明了, 出錯.

構(gòu)造函數(shù): D會直接初始化b. 派生類會直接初始化所有的虛基類. 因此, 當(dāng)初始化一個派生類的時候, 編譯器按照初始化順序, 一個一個看是否有虛基類, 如果有, 則先把這個繼承的虛基類初始化. 所有的虛基類都初始化完成后, 再去重頭看, 按照原來的方式初始化所有的類.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容