网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区



标题: [C++] 有个关于虚函数的问题
游客
未注册









发表于 2008-7-4 10:35 资料 短消息 加为好友
为什么析构函数也要虚呢。。。。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:35 资料 短消息 加为好友
C/C++ code
class TestBase
{
public:
    virtual ~TestBase(){}
    virtual void out(){
        cout<<"Base"<<endl;
    }
};

class TestDerive
{
public:
    virtual ~TestDerive(){}

    void  out(){
        cout<<"Derive"<<endl;
    }
};

int main()
{
        TestDerive *pDerive = new TestDerive();
    TestBase *pBase = (TestBase *) pDerive;
    pDerive->out(); //输出“Derive”
    pBase->out();  //输出“Derive”也是虚的。
    delete pBase;

    system("pause");
}

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:35 资料 短消息 加为好友
妈的不在状态!!

C/C++ code
class TestBase
{
public:
    virtual ~TestBase(){}
    virtual void out(){
        cout<<"Base"<<endl;
    }
};

class TestDerive : public TestBase
{
public:
    virtual ~TestDerive(){}

    void  out(){
        cout<<"Derive"<<endl;
    }
};

int main()
{
        TestDerive *pDerive = new TestDerive();
    TestBase *pBase = (TestBase *) pDerive;
    pDerive->out(); //输出“Derive”
    pBase->out();  //输出“Derive”也是虚的。
    delete pBase;

    system("pause");
}

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
意思不是这个,我的意思是定义的时候如果不是虚函数形式,而是基类和派生类函数同名,这个时候用派生类地址赋给基类指针的话,用这个指针来调用函数是调用的哪个的?

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
派生的虚虚构函数在调用的时候同时也调用了基类的析够函数,这样用起来方便

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
但是基类和派生类的析构函数即使不是虚的,那么在派生类对象被析构的时候也会自动调用基类的析构函数啊

那么方便在哪里呢

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
没用Virtual怎么是虚函数,那个是被基类覆盖派生类了吧!

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
这个叫做同名覆盖。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
楼主把下面的这个例子看懂就清楚了。


C/C++ code
#include<iostream>
using namespace std;
class Base
{
public:
    virtual void xfn(int i)
    {
        cout << "Base::xfn(int i)" << endl;
    }

    void yfn(float f)
    {
        cout << "Base::yfn(float f)" << endl;
    }

    void zfn()
    {
        cout << "Base::zfn()" << endl;
    }
};

class Derived:public Base
{
public:
    void xfn(int i)
    {
        cout << "Derived::xfn(int i)" << endl;
    }

    void yfn(int c)
    {
        cout << "Derived::yfn(int c)" << endl;
    }

    void zfn()
    {
        cout << "Derived::zfn()" << endl;
    }
};


void main()
{
    Derived d;
    Base *pB    = &d;
    pB->xfn(5);
    pB->yfn(3.14f);
    pB->zfn();

    cout << "========================" << endl;

    Derived *pD = &d;
    pD->xfn(5);
    pD->yfn(3.14f);   
    pD->zfn();
}

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:36 资料 短消息 加为好友
为什么析构函数也要虚呢。。。。
使用基类的指针指向派生对象时,如果析构函数不是虚函数那么就不会调用到派生类的析构函数

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-9-6 01:53
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.043799 second(s), 7 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP