C++覆盖,隐藏,重载

C++覆盖,隐藏,重载,第1张

概述  定义 函数覆盖 (1) 作用域不同 (2) 有virtual关键字 (3) 参数列表/返回值/调用约定必须相同 函数隐藏 (1) 作用域不同 (2) 函数名相同 (3) 参数列表/返回值/调用约定不考虑 函数重载 (1) 作用域相同 (2) 函数名相同 (3) 参数列表不同,返回值/调用约定不考 练习 class Base{public: virtual void Handl

 

定义 函数覆盖
(1) 作用域不同
(2) 有virtual关键字
(3) 参数列表/返回值/调用约定必须相同 函数隐藏
(1) 作用域不同
(2) 函数名相同
(3) 参数列表/返回值/调用约定不考虑 函数重载
(1) 作用域相同
(2) 函数名相同
(3) 参数列表不同,返回值/调用约定不考 练习
class Base{public:    virtual voID Handle1(float x)    {        cout << "Base::Handle1(float) " << x << endl;    }    voID Handle2(float x)    {        cout << "Base::Handle2(float) " << x << endl;    }    voID Handle3(float x)    {        cout << "Base::Handle3(float) " << x << endl;    }};class Derived : public Base{public:    virtual voID Handle1(float x)    {        cout << "Derived::Handle1(float) " << x << endl;    }    voID Handle2(int x)    {        cout << "Derived::Handle2(int) " << x << endl;    }    voID Handle3(float x)    {        cout << "Derived::Handle3(float) " << x << endl;    }    voID Handle3(double x)    {        cout << "Derived::Handle3(double) " << x << endl;    }};

观察以上类声明及实现,试预测以下main中的执行结果,注意两点:

调用的方法是哪个? 调用造成的原因,是重载、覆盖、隐藏中的哪一种?
 voID main(voID) {     Derived DervObj;     Base *pBase = &DervObj;        Derived *pDerv = &DervObj;      pBase->Handle1(3.14f);     /******************************************     预测:           输出Derived::Handle1(float)3.14           是间接调用,覆盖     运行结果:Derived::Handle1(float)3.14     ******************************************/       pDerv->Handle1(3.14f);     cout << endl;     /******************************************     预测:           输出Derived::Handle1(float)3.14           是间接调用,隐藏     运行结果:Derived::Handle1(float)3.14     ******************************************/       pBase->Handle2(3.14f);     /*****************************************     预测:           输出Base::Handle2(float)3.14           是直接调用,隐藏     运行结果:Base::Handle2(float)3.14     *****************************************/        pDerv->Handle2(3.14f);     /****************************************     预测:           输出Derived::Handle2(int)3           是直接调用,隐藏     运行结果:Derived::Handle2(int)3     *****************************************/     cout << endl;        pBase->Handle3(3.14f);     /****************************************     预测:           输出Base::Handle3(float)3.14           直接调用,隐藏     结果:Base::Handle3(float) 3.14     }     ****************************************/       pDerv->Handle3(3.14f);     /***************************************       预测:输出Derived::Handle3(float)3.14             直接调用,隐藏       结果:Derived::Handle3(float) 3.14     }     ***************************************/       pDerv->Handle3(3.14);     /**************************************       预测:输出Derived::Handle3(double)3.14             直接调用,隐藏       结果:Derived::Handle3(double) 3.14     **************************************/     cout << endl;          pDerv->Handle3(3);     /****************************************       Handle3没有对应的整数形参,只有float和double       3既可以转换为float,又可以转换为double,所以编译时报错。     /****************************************/     system("pause"); }
总结

当覆盖,隐藏,重载同时存在时,如何确定调用了某个类的某个函数? a)查看调用该函数的数据类型,并找到该类型的作用域(函数隐藏) b)在该作用域中找到同名函数,满足参数列表相同(可以做适当的类型转换),在从这些同名函数中选出最佳的, 如果有多个则产生二义性(函数重载) c)查看选出的最佳匹配函数是否是虚函数,如果是虚函数并且调用该虚函数的数据类型为指针或引用, 那么就是间接调用,否则就是直接调用(函数覆盖)

总结

以上是内存溢出为你收集整理的C++覆盖,隐藏,重载全部内容,希望文章能够帮你解决C++覆盖,隐藏,重载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存