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 两个过程是对称的,也就是说,先调用构造函数的类,后调用析构函数。
*/