虚函数 重写跟隐藏
虚函数重写和隐藏按理来说 执行结果应该是 :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();
重写? 隐藏
[解决办法]
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);
[解决办法]
看来你还没弄清楚什么叫函数隐藏:
#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函数来说的,在继承类中对他进行重新定义;
隐藏:隐藏我这么理解,就是以自己本身的函数为主,其他同名(如继承而来的)不管;