1.命名空间
1.1 基本形式
namespace ns{
/*...*/
} //没有";"
- 不能出现在函数或类的内部。
- ::member_name表示全局作用域内。
1.2 inline命名空间
外层可以直接访问,常用于版本更新的便捷。
/*Fifth.h*/
inline namespace Fifth{
/*...*/
}
/*Fourth.h*/
inline namespace Fourth{
/*...*/
}
namespace cplusplus{
#include "Fifth.h"
#include "Fourth.h"
/*...*/
}
1.3未命名的命名空间
- 仅在本文件有效,外部命名空间可直接访问,相当于本文件的全局变量(用静态生命周期)
- 替代原先的static(c++11已取消),当需要声明局部与文件的实体时用到。
1.4使用命名空间的成员
1.4.1命名空间的别名
namespace A{
namespace B{
namespace C{
var;
}
}
}
namespace newname = A::B::C;
newname::var; //直接访问C中的var
1.4.2 using声明与重载
using声明只是简单地令某个成员在局部作用域中有效。
using namespace A::print; //将A中的所有print版本全部包含到using声明所在作用域
- 重载using声明所属域中的其它同名函数。
- 所属作用域中若有同名且形参列表相同的版本,将引发编译错误。
- 隐藏外层作用域的相关声明。
1.4.3 using指示与重载
令整个命名空间的所有内容变得有效。
using namespace A; //将A中的所有成员包含到using声明所在作用
- 与using声明不同,即使存在同名变量(同名且参数列表相同的函数),编译器也不会报错,只是会存在二义性,需使用者明确指定。
2.多重继承与虚继承
2.1 Tips
- 基类的构造顺序与派生列表中基类的出现顺序保持一致。
- 虚基类总是先于非虚基类构造,与它们在继承体系中的次序和位置无关。
- 当一个类拥有多个基类,若存在从两个或更多基类中继承了同名成员,此时若不加限定符而直接使用会出现二义性。
2.2 虚继承
共享的基类被称为虚继承,如图中VB为虚基类,B1,B2以’public virtual VB’的方式派生。
2.3 构造顺序
class X: public B2,public B3,public virtual VB2
{
/*...*/
};
先对虚基类进行构造,而VB1优于VB2,再构造普通基类B1>B2>B3,再构造自己。
顺序VB1、VB2、B1、B2、B3、X