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


标题: [C++] 有个关于虚函数的问题
oiusde
TW高级会员
Rank: 4


UID 117396
精华 50
积分 994
帖子 385
阅读权限 50
注册 2007-4-11
状态 离线
发表于 2008-6-30 11:31 资料 短消息 加为好友
有个关于虚函数的问题

都知道如果在基类定义虚函数的话,用基类的指针指想派生类可以调用派生类的同名函数,但是如果定义虚函数的时候没有用virtual,也就是基类和派生类函数同名,那么用基类的指针指想派生类的时候,调用的还是派生类的吗?这个调用过程谁能说以下是怎么回事?

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:33
定义虚函数的时候没有用virtual??没有用virtual怎么定义虚函数,???
没有将函数定义为虚函数,调用子类的基类成员函数(这里有函数隐藏的问题)

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:33
当然不是了!他们是完全的两个函数。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:33
不是,属于静态调用,仍然是基类的函数。你可以想一下名字查找

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:33
这个有点像变量的作用域!

C/C++ code
int i=1;
{
   int i=2;
   cout<<i<<endl;
}
cout<<i<<endl;

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:33
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”,非虚函数void out()覆盖了继承下来的虚函数。
    pBase->out();  //调用的时候会出错,提示函数地址为NULL
    delete pBase;

    system("pause");
}

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:34
如果没用Virtual,调用的是派生类的函数,因为在这种情况下产生了覆盖,如果想要调用基类的同名函数就要用“::“作用域符号。
如果用了Virtual,那就可以肯定是调用了派生类的函数。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:34
楼上的例子,问题很多啊

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:34
如果LZ是说在派生类中定义基类同名虚函数时没有使用virtual的话
那么还是调用派生类函数
即使派生类再派生,同时定义派生派生类的同名虚函数是没有使用virtual
那么还是调用派生派生类函数

总之一句话,只要基类虚了,它的儿子,孙子,曾孙。。。。都是虚的

引用 回复 顶部
游客
未注册









发表于 2008-7-4 10:35
呵呵,好像是错了...
惭愧...

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





当前时区 GMT+8, 现在时间是 2008-10-8 04:15
京ICP证060517号

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

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