续
续命名空间:
当我们向函数传递一个类时,我们除了查找常规作用域还查找了类所属的作用域
如果一个函数被声明为友元(即使它还未被声明)那我们认为他是最近的外层空间的成员。
多重继承与虚继承:
构造函数的继承
class Pi:Base{ using Base::Base; }
编译器将会生成Pi(...)的构造函数,...与Base构造函数的相同。
派生类的析构函数只需处理自己的对象,基类会自动交由基类的析构函数处理。
虚析构函数的意义在于能够,在动态绑定的情况根据动态类型进行确切的析构函数。
”基类树“中是允许同名的成员的,但在直接调用的时候就会产生二义性,应该通过访问符取特定的版本。(访问符是可以跳级的)
编译器不会判断派生类向基类转换的好坏,在函数调用时就会产生二义性。
static_cast返回的是右值 最近才发现(
虚继承:
之前一直在纠结“共享基类”是什么意思,以为也是会重复定义。
其实我们定义的是某个派生类,在这个派生类创建时,创建出一份实例,让他们一起共享。
普通继承关系中,派生类只能初始化直接基类。
虚继承关系中,允许派生类初始化虚基类。
虚继承关系中最底层(最儿子)的派生类的构造函数进行如下过程:
构造虚基类
构造直接基类
我们的直接基类的构造函数中可能也会存在构造虚基类的步骤,但是如果它不是在对底层,该语句将无法产生任何效果!!
一个派生类允许有多个虚基类
到此 18章完