荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: bakey (三日不见,如隔24抽), 信区: Program
标  题: [合集]一个关于虚函数与函数重载的问题,为什么会是这个结果呢
发信站: 荔园晨风BBS站 (2005年09月28日19:20:58 星期三), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: MiYear (MiYear), 信区: Program
标  题: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: Thu Sep  8 16:08:42 2005

近日看林锐的《高质量VC++编程指南》,在令人迷惑的隐藏规则这一小节里,我把他的例
子程序稍作了一下更改,如下:
#include "stdafx.h"
#include "string.h"
#include <iostream.h>

class Base
{
public:
        virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
};

class Derived : public Base
{
public:
        virtual void f(int x){ cout << "Derived::f(int) " << x << endl; }
};

void main(void)
{
        Derived  d;
}

结果运行为:
Base::f(float) 3.14
Derived::f(int) 3
对此结果,我的理解是派生类有两个函数名相同、但参数不同的f函数(一个是自有的,另
一个是从基类继承而来的),这种解释下,可以理解第一个结果为Base::f(float)3.14了,
可是如果按这种理解,第二个结果应该为Base::f(float) 3才对啊。望站友解释下它的运行
过程,谢先。


☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: achang (马甲被封), 信区: Program
标  题: Re: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: 2005年09月09日17:17:36 星期五

看了这篇东西,我有两点想说:
1.这个f函数不是个虚函数
2.如果以一个"基类之指针",指向一个"派生类之指针"时,经过此指针只能调用基类的
  (而不是派生类)所定义的函数.(出自:<深入浅出MFC>).这也是你的程序
  第一个输出的原因




☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: MiYear (MiYear), 信区: Program
标  题: Re: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: 2005年09月12日20:06:22 星期一

关于第2点,无议异之处。
但是第一点,不甚明了,为什么说f函数不是虚函数呢?
我们可以写个类Class_C来继承Derived,该类中写个成员函数void f(float x){ cout <<
"class Class_C::f(float x) " << x <<endl; },接下来,在main函数中Class_C c;pb
= &c; pb->f(3.14),运行,结果是class Class_C::f(float x) 3.14。这说明什么问题呢
?这说明此处的基类型指针pb是“运行时绑定”的,也即是说,Base类中的成员函数f为虚
函数。用类似的方法,我们可以运行得出类Derived中的f函数也为虚函数。这些,是我在
机器上实际运行得到的,大家可以试试。

欢迎继续讨论。



☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: achang (阿昌), 信区: Program
标  题: Re: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: 2005年09月12日20:24:52 星期一

如果虚函数在基类与子类中出现的仅仅是名字的相同,而参数类型不同,或返回类型
不同,即使写上了virtual关键字,则也不进行迟后联编。
这可能是虚函数,但即使是,它也是不恰当的虚函数




☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: mmkiller (L㊣VE), 信区: Program
标  题: Re: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: 2005年09月12日20:58:24 星期一

 高手~以后我做了包工头第一个就请你
 你以后跟定我了~~~~




☆   6  ──────────── 我是分割线 ─────────────────☆
发信人: MiYear (MiYear), 信区: Program
标  题: Re: 一个关于虚函数与函数重载的问题,为什么会是这个结果呢
时  间: 2005年09月13日21:00:32 星期二

汗自己一个先
现在终于弄明白了为什么是那种运行结果
子类的函数与基类的某个函数如果函数名相同(然而返回类型,或者参数类型是不同的)
,这时,无论有无virtual关键字,都为隐藏,而并非覆盖。即然为隐藏,那么,自然也就
是前向联编了。


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店