【TOJ 5241】C++实验:虚析构函数(virtual用法及构造析构的进行顺序)

描述

用C++实现类Base和Derived,使其能输出样例信息。

主函数里的代码已经给出,请补充完整,提交时请勿包含已经给出的代码。

int main()
{
	Base b;
	Base *p = new Derived;
	delete p;
	return 0;
}

输入

输出

输出样例信息

样例输入

 

样例输出

Base Constructor
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor
Base Destructor

题解

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行;

构造的顺序是: 基(base) -> 派生(derived)【即先构造基类, 再构造派生类】

因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成;

如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败;

析构的顺序是: 派生(derived) -> 基(base)【即先释放派生类, 再释放基类】

因为 派生类 需要先释放调用的基类资源, 所以应该优先释放;

基类的析构函数加了virtual就可以动态绑定派生类的析构函数,这样的话,在执行多态后删除其对象,就可以在删除对象的时候执行派生类的析构函数了(当然执行基类的析构函数是一定会的)。否则不会执行派生类的析构函数,只会执行基类的析构函数。

#include<iostream>
using namespace std;
class Base{
public:
    Base()
    {
        cout<<"Base Constructor"<<endl;
    }
    virtual~Base()
    {
        cout<<"Base Destructor"<<endl;
    }
};
class Derived:public Base{
public:
    Derived()
    {
        cout<<"Derived Constructor"<<endl;
    }
    ~Derived()
    {
        cout<<"Derived Destructor"<<endl;
    }
};
int main()
{
    Base b;
    Base *p = new Derived;
    delete p;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kannyi/p/9052932.html