public: C(int a):B(a){cout<<\ //负责直接基类B的构造 };
void main() { C c(3); }
如果类B中也有一个参数,那么这样程序该是什么样的呢? //===================================== // 自编
//===================================== #include
//------------------------------------- class A{ protected: int x; public: A(int a){cout<<\};
class B:public A{ protected: int x; public: B(int a,int b):A(a){cout<<\};
class C:public B{ protected: int x; public: C(int a,int b):B(a,b){cout<<\};
void main() { C c(3,4); }
再如果C中也有一个参数呢?
//===================================== // 自编
//===================================== #include
//------------------------------------- class A{ protected: int x; public: A(int a){cout<<\};
class B:public A{ protected: int x; public: B(int a,int b):A(a){cout<<\};
class C:public B{ protected: int x; public: C(int a,int b,int c):B(a,b){cout<<\};
void main() { C c(3,4,5); }
建立派生类对象时,构造函数的执行顺序如下: ? 调用基类的构造函数,如果基类构造调用在初始化列表中存在,就按初始化列表的
调用形式做;否则,就调用相应的基类无参构造函数。如基类上面还有基类,则会调用上面的基类构造函数。依次上溯。
? 调用子对象的构造函数,调用顺序按类定义中对象声明的顺序。 ? 调用派生类的构造函数。 下面我们来通过实例说明。
//===================================== //自编
//===================================== #include
//------------------------------------- class Member{ public: Member(int x){cout<<\};//----------------------------------- class S{ public: S(int x){cout<<\
};//----------------------------------- class G: public S{ Member meb; public: G(int x,int y):meb(y),S(x){cout<<\ };//----------------------------------- int main(){ G g(1,2);
}//==================================== 运行结果是: S 1 Member 2 G
从结果可以看到,是先执行基类构造函数,再执行子对象的构造函数,再执行派生类的构造函数。
如果基类又有基类时,也就是一个多层的结构时,且基类又有子对象的情况会怎么样? //===================================== //自编
//===================================== #include
//------------------------------------- class Member1{ public: Member1(int x){cout<<\};//----------------------------------- class Member2{ public: Member2(int x){cout<<\};//----------------------------------- class S1{ public: S1(int x){cout<<\ \};//----------------------------------- class S11:public S1{ public: S11(int x1,int x2):S1(x1){cout<<\ \};//-----------------------------------
class S111: public S11{ Member1 meb1;
Member2 meb2; //声明顺序是meb1 meb2 public:
S111(int x1,int x2,int x3,int x4):S11(x1,x2),meb2(x3),meb1(x4){cout<<\};//----------------------------------- int main(){
S111 s(1,2,3,4);
}//==================================== 运行结果: S1 1 S11 2 Member1 4 Member2 3
下面的程序是对上面程序的修改,考虑了无参构造函数以及有析构函数的情况。 //===================================== //自编
//===================================== #include
//------------------------------------- class Member1{ public: Member1(int x){cout<<\ ~Member1(){cout<<\};//----------------------------------- class Member2{ public: Member2(int x){cout<<\ ~Member2(){cout<<\};//----------------------------------- class S1{ public: S1(){cout<<\ S1(int x){cout<<\ \ ~S1(){cout<<\};//----------------------------------- class S11:public S1{ public: S11(){cout<<\ S11(int x1){cout<<\ \ S11(int x1,int x2):S1(x1){cout<<\ \ ~S11(){cout<<\};//-----------------------------------
class S111: public S11{ Member1 meb1;
Member2 meb2; public: S111(int x1,int x2):meb2(x1),meb1(x2){cout<<\ S111(int x1,int x2,int x3):S11(x1),meb2(x2),meb1(x3){cout<<\ S111(int x1,int x2,int x3,int x4):S11(x1,x2),meb2(x3),meb1(x4){cout<<\ ~S111(){cout<<\};//----------------------------------- int main(){ S111(1,2);
cout<<\ S111(1,2,3);
cout<<\ S111 s(1,2,3,4);
}//==================================== 运行结果为: S1 S11
Member1 2 Member2 1 S111 ~S111 ~Member2 ~Member1 ~S11 ~S1
------------------------------------------- S1 S11 1 Member1 3 Member2 2 S111 ~S111 ~Member2 ~Member1 ~S11 ~S1
------------------------------------------- S1 1 S11 2 Member1 4 Member2 3 S111 ~S111 ~Member2
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章 继承与派生(5)在线全文阅读。
相关推荐: