派生类构造函数

 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 }
也就是把基类的构造函数的参数初始化了,这也相当于一种默认构造函数。编译就通过了。
应该是如果初始化列表里的初始化不完全的话,程序就会去找类的默认构造函数,因为之前代码的类的构造函数,有参数,且没有初始化,所以就找不到默认构造函数,于是报错。

猜你喜欢

转载自www.cnblogs.com/haook/p/10673905.html