第十八章:命名空间与多重继承

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值