首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

析构函数里可以调用虚函数嘛,该怎么处理

2013-02-24 
析构函数里可以调用虚函数嘛class test{virtual void fun(){}public:~test{fun()}}问题1:这个代码对吗?问

析构函数里可以调用虚函数嘛
class test
{
virtual void fun(){}

public:

~test
{
fun();

}

}

问题1:这个代码对吗?

问题2; 对象是什么时候被销毁的,是析构函数执行完毕,才被销毁的么?

还是进入析构函数,就开始销毁了一些成员啊,什么的?




[解决办法]

引用:
引用:可以调用,但是不再有多态性,其调用的是当前类所定义的函数。

那问题2呢?

额,我没看完。首先你的程序和你想要表达的我觉得有点问题,如果要获得多态必须要使用指针或者引用来调用虚函数。而你的确实直接调用的,你可以这样实验:
#include <iostream>


class Base
{
public:
    virtual void fun()
    {
        std::cout << "Base fun\n";
    }
    virtual ~Base(){this ->fun();}
};

class Derived:public Base
{
public:
    void fun()
    {
        std::cout << "Derived fun\n";
    }
};
int main()
{
    Base *ptr(new Derived);
   // ptr->fun();
    delete ptr;
    return 0;
}

输出:Base fun
问题2: 对象的销毁应该分为两个阶段:1、释放对象持有的资源。2、释放对象本身所占有的内存。析构函数只负责第一个阶段。第二个阶段是由编译器(在栈上定义的对象)或者delete(在堆上定义的对象)来完成。所以对象在析构函数的哪个地方释放其所持有的资源是有程序作者决定的。
[解决办法]
1.这样的代码不对:首先你的自己构建的析构函数就是一个格式错误的
2.通常来说:析构函数是隐士调用(系统当发现这个对象无用时),无需程序员调用的
3.对你标题谁问到的一个问题:析构函数能否调用虚函数,其实是可以的,
但是这个析构函数必须是自己构建的才可以

热点排行