再来回顾下继承派生的语法。
继承方式显示有三种(public, protected, privatez),隐式默认private。所谓继承方式,是指派生类对基类成员的访问权限控制。
派生类构造函数定义的一般格式如下:
派生类名(参数总表):基类名1(参数表1),...,基类名m(参数表m),
成员对象名1(成员对象参数表1),...,成员对象名n(成员对象参数表n)
{
派生类新增成员的初始化;
}
构造函数调用次序:
1.调用基类构造函数 2.调用内嵌成员对象的构造函数 3.派生类自己的构造函数
示例:
1 #include <iostream> 2 using namespace std; 3 4 class A { 5 private: 6 int l1, l2; 7 public: 8 A(int l1 = 1, int l2 = 2) :l1(l1), l2(l2) {} 9 void show() { 10 cout << "I'm A." << endl; 11 } 12 }; 13 class B { 14 private: 15 int lv1, l2; 16 public: 17 B(int lv1 = 1, int l2 = 2) :lv1(lv1), l2(l2) {} 18 void show() { 19 cout << "I'm B." << endl; 20 } 21 }; 22 class C: public A, public B{ 23 private: 24 int lv1, lv2; 25 A ta; 26 public: 27 C(int r1, int r2, int r3, int r4, int r5, int r6, int r7, int r8) :A(r1, r2), B(r3, r4), ta(r5, r6) { 28 this->lv1 = r7; 29 this->lv2 = r8; 30 } 31 void show() { 32 cout << "I'm C." << endl; 33 A::show(); 34 B::show(); 35 } 36 }; 37 38 int main() { 39 C tc(1, 2, 3, 4, 5, 6, 7, 8); 40 tc.show(); 41 return 0; 42 }
假若多个基类拥有相同名称的成员x,而此时派生类去调用x,系统无法判断去调哪个基类的x,由此产生二义性。解决方式可以是成员名限定(eg:A::show();)或者成员重定义(同名覆盖,如上例的C::show())。