1、写出运行结果:

// test1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class A
{
public:
	A(){cout<<"A::A() called.\n";}
	virtual ~A(){cout<<"A::~A() called.\n";}
};

class B:public A
{
public:
	B(int i){
		cout<<"B::B() called.\n";
		buf=new char[i];
	}
	virtual ~B(){
		delete []buf;
		cout<<"B::~B() called.\n";
	}
private:
	char *buf;
};


void fun(A *a){delete a;}


int _tmain(int argc, _TCHAR* argv[])
{
	A *a=new B(15);
	fun(a);

	getchar();
	return 0;
}


解答:

// test1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

// 定义一个类:A
class A
{
public:
	A(){cout<<"A::A() called.\n";}            // 类A的构造函数
	virtual ~A(){cout<<"A::~A() called.\n";}  // 类A的析构函数
};

// 定义一个类B,继承于类A
class B:public A
{
public:
	// 类B的构造函数
	B(int i){
		cout<<"B::B() called.\n";
		buf=new char[i];
	}
	// 类B的析构函数
	virtual ~B(){
		delete []buf;
		cout<<"B::~B() called.\n";
	}
private:
	char *buf;
};

// 全局函数
void fun(A *a){delete a;}

// main函数
int _tmain(int argc, _TCHAR* argv[])
{
	A *a=new B(15);  // 调用类B的构造函数
	fun(a);          // 调用全局函数

	getchar();
	return 0;
}


// 过程说明:
/*
1、A *a=new B(15);这一句,先调用B类的构造函数,而调用B类的构造函数时,因为B类是继承于A类,所以还会先调用A类的构造函数,执行完A类的构造函数后,接着执行B类的构造函数的函数体中的内容。
2、fun(a);这一句,是将new的变量释放掉。需要调用B类的析构函数,同理,也会调用A类的析构函数。

注意:1和2 两个过程是对称的,也就是说,先调用构造函数的类,后调用析构函数。

*/



构造与析构的次序_#include