多继承时的继承顺序:
调用基类的构造函数,调用顺序按照他们被继承时声明的顺序从做到又继承。
Talk is cheap.show me the code:
运行结果如下:
看到了没,多个基类构造函数的执行顺序是由最开始的继承列表中的声明顺序决定的:
class Derived : public Base2,public Base1,public Base3
另外,我们也可以看到,派生类中的成员变量的初始化顺序也是按照他们在类中的声明的顺序来的。
拷贝构造函数
派生类的构造函数要负责给基类的构造函数传参数,这是毫无疑问的;派生类的拷贝构造函数也要给基类的拷贝构造函数传参数。
和构造函数不同的地方在于,拷贝构造函数的参数只能有一个:派生类对象的引用。那么怎么去给基类的拷贝构造函数传参数?
我们知道公有派生的派生类对象可以当做基类对象使用的,这叫向上转型。所以直接把派生类的对象的引用传给基类去。
C:C(const C &c1):B(c1){...}
析构函数:
析构函数不会继承,需要派生类自行声明;
不需要显示的调用基类的析构函数,系统会自动隐式调用。
同名隐藏规则:
派生类中的同名成员会对基类中的同名成员进行覆盖,如果要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名限定。
但是如果从多个基类中继承来的多个同名成员没有在派生类中被隐藏的话,派生类在调用的时候就就不知道用哪个。
这也就是二义性问题:
解决二义性的方法:
- 用类名来限定c1.A::f()或c1.B::f()
- 同名隐藏
关于虚继承:
如果两个类都继承了同一个基类,另一个类同时继承了这两个类,形成了一个闭环。那么在这个派生类中会从两条路径继承来两份最初基类中的成员:
此时可以让这两个类虚继承。虚继承通过增加一个指针,来间接访问基类数据: