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

虚函数 重写跟隐藏

2013-10-30 
虚函数重写和隐藏按理来说 执行结果应该是 :Base::xfn(int i)Derive::xfn(int i)Derive::yfn(float i)Deri

虚函数 重写和隐藏


按理来说 执行结果应该是 :

Base::xfn(int i)
Derive::xfn(int i)

Derive::yfn(float i)
Derive::yfn(float i)

Derive::zfn();
Derive::zfn();
重写? 隐藏
[解决办法]

引用:
Quote: 引用:

只有虚函数是动态绑定,所以 pb->[yz]fn 都调用基类的。


你看子类的xfn(int i)应该来说是虚函数(不管前面有没有virtual),执行结果显然不对!

其次,你在看子类的yfn()和zfn()显然是隐藏了基类的yfn()和zfn(),执行结果显然不对!



   pb->xfn(1);   //xfn is virtual, so it is Derive::xfn
   pd->xfn(1);

 pb->yfn(1.23);  //yfn is not virtual, so it's Base::yfn
   pd->yfn(1.23);
[解决办法]
引用:
Quote: 引用:

看来你还没弄清楚什么叫函数隐藏:
#include <iostream>
using namespace std;

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

class Derive :public Base
{
public:
void fun()
{
cout << "Derive::fun()" << endl;
}
};


int main()
{
Derive d;
d.fun();//正确
//d.fun(1);//错误,基类中的void fun(int i)被隐藏
d.Base::fun(1);//正确

system("pause");
return 0;
}


那这位大侠的意思是 所谓隐藏  对于我这个例子的指针是没用的,它由原始指针类型而定,与实际指向的对象无关! 那么隐藏只会发生在对象上,而不会发生在子类指针上,是这样的么?


前半句有那么点意思了,但后半名我就不能理解了。
 pb->yfn(1.23); 对于这一句,pb本身就是基类的指针,如果不做强制类型转换用,它只能访问基类的yfn(),不存在什么隐藏不隐藏的问题。
 pd->yfn(1.23); 对于这一句,你有没想过,基类和派生类都有void yfn(float i)这一个原型相同的函数,为什么它知道该调用派生类的yfn()而不是基类的yfn()呢?因为基类中的yfn()已经被隐藏了。

对 函数重载、函数隐藏、函数重写(覆盖)和概念,可以参考:
http://blog.csdn.net/qq6680040/article/details/13161381

[解决办法]
Base::xfn(int i)
Derive::xfn(int i)
这里是因为virtual的原因,virtual函数进行的是动态绑定,否则永远绑定的是基类的函数

Derive::yfn(float i)
Derive::yfn(float i)

Derive::zfn();
Derive::zfn();
这里由于没有virtual,那么他永远都是绑定的是基类函数

重载:指的是在同一个作用域中,且函数名字和形参必须完全相同;
重写:他是对virtual函数来说的,在继承类中对他进行重新定义;
隐藏:隐藏我这么理解,就是以自己本身的函数为主,其他同名(如继承而来的)不管;

热点排行