1 #include<iostream> 2 using namespace std; 3 4 class Base1{ 5 public: 6 Base1(int i){ 7 cout<<"Base1 "<<i<<endl; 8 } 9 }; 10 11 class Base2{ 12 public: 13 Base2(int j){ 14 cout<<"Base2 "<<j<<endl; 15 } 16 }; 17 18 class Derived:public Base2, public Base1{ 19 public: 20 Derived(int a,int b,int c,int d):Base1(a),member1(c),member2(d),Base2(b){} 21 private: 22 Base1 member1; 23 Base2 member2; 24 }; 25 26 int main() 27 { 28 Derived obj(1,2,3,4); 29 }
这是一个派生类构造函数的例子,照书上打的,简化了一些。
在Derived类构造函数中,先调用基类的构造函数,然后调用内嵌对象的构造函数。
调用顺序先按这里的顺序来
class Derived:public Base2, public Base1{……}
先是Base2,再是Base1
然后是按这边的顺序
private:
Base1 member1;
Base2 member2;
先是Base1,再是Base2
1 #include<iostream> 2 using namespace std; 3 4 class Base1{ 5 public: 6 Base1(int i){ 7 cout<<"Base1 "<<i<<endl; 8 } 9 }; 10 11 class Base2{ 12 public: 13 Base2(int j){ 14 cout<<"Base2 "<<j<<endl; 15 } 16 }; 17 18 class DD:public Base1, public Base2{ 19 public: 20 DD(int a,int b):Base1(a),Base2(b){} 21 private: 22 Base1 member1; 23 Base2 member2; 24 }; 25 26 int main() 27 { 28 DD obj(1,2); 29 }
如果我把代码改成这样,只初始化基类,而不初始化内嵌对象,就会报错no matching function for call to ‘Base1::Base1()’
我在把代码改一下,变成这样
1 #include<iostream> 2 using namespace std; 3 4 class Base1{ 5 public: 6 Base1(int i=0){ 7 cout<<"Base1 "<<i<<endl; 8 } 9 }; 10 11 class Base2{ 12 public: 13 Base2(int j=0){ 14 cout<<"Base2 "<<j<<endl; 15 } 16 }; 17 18 class DD:public Base1, public Base2{ 19 public: 20 DD(int a,int b,int c,int d):member1(c),member2(d){} 21 private: 22 Base1 member1; 23 Base2 member2; 24 }; 25 26 int main() 27 { 28 DD obj(1,2,3,4); 29 }
也就是把基类的构造函数的参数初始化了,这也相当于一种默认构造函数。编译就通过了。
应该是如果初始化列表里的初始化不完全的话,程序就会去找类的默认构造函数,因为之前代码的类的构造函数,有参数,且没有初始化,所以就找不到默认构造函数,于是报错。