Thinking in C++读书笔记--13.4继承与组合

本文详细介绍了C++中构造函数与析构函数的调用顺序,通过具体实例展示了如何在类层次结构中正确地初始化和清理资源,强调了构造函数与析构函数调用的次序对程序正确性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
#include <iostream>
using namespace std;
//13.4组合与继承的联合
class A {
 int i;
public:
 A( int I ) { i = I; }
 ~A() {}
 void f() const {}
};

class B {
 int i;
public:
 B( int I ) { i = I; }
 ~B() {}
 void f() const {}
};

class C : public B {
 A a;
public:
 C( int I ) : B( I ), a( I ) {}//调用了基类的构造函数和成员对象的构造函数
 ~C() {}//调用~A与~B
 void f() const {//重定义了所继承的B::f(),并且还调用基类的版本。(只能在继承期间重定义函数)
  a.f();//通过成员对象,只能操作这个对象的公共接口,而不能重定义它
  B::f();//
 }
};

//13.4.1构造函数和析构函数的次序

#define CLASS(ID) class ID {/
public:/
 ID( int ) { cout <<#ID <<" constructor" <<endl; } /
 ~ID( ) { cout <<#ID <<" destructor" <<endl; }/
};
CLASS( base1 );
CLASS( member1 );
CLASS( member2 );
CLASS( member3 );
CLASS( member4 );

class derived1 : public base1 {
 member1 m1;
 member2 m2;
public:
 derived1( int ) : m2( 1 ), m1( 2), base1( 3 ) {
  cout <<"derived constructor" <<endl;
 }
 ~derived1( ) {
  cout <<"derived destructor" <<endl;
 }
};

class derived2 : public derived1 {
 member3 m3;
 member4 m4;
public:
 derived2( ) : m3( 1 ), m4( 2 ), derived1( 3 ) {
  cout <<"derived2 constructor" <<endl;
 }
 ~derived2( ) {
  cout <<"derived2 destructor" <<endl;
 }
};
int _tmain(int argc, _TCHAR* argv[])
{
 C c( 47 );
 derived2 d2;
 return 0;
}

 程序的输出如下图所示:

可见,构造在类层次的最根处开始,在每一层,首先调用基类的构造函数,然后调用成员对象构造函数。调用析构函数则严格按照构造函数的相反顺序进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值