
本篇主要介绍C++中函数覆盖、重载、隐藏如何判断什么时候被使用?
实际使用过程中很少会出现几种类型一起出现的情况,因此作为理解及未来细品之用。
1.总结:
2.学习视频地址:
函数覆盖、重载、隐藏的调用秘笈1
函数覆盖、重载、隐藏的调用秘笈2
3.学习笔记:
#includeclass base { public: virtual void Handle1(float x) { printf("base::Handle1(float)"); } void Handle2(float x) { printf("base::Handle2(float)"); } void Handle3(float x) { printf("base::Handle3(float)"); } }; class Derived :public base { public: //父类中已经声明为虚函数,子类中virtual可写可不写 //同名,参数返回值等一致,构成覆盖 virtual void Handle1(float x) { printf("base::Handle1(float)"); } //与父类函数的同名函数构成了函数隐藏 void Handle2(float x) { printf("base::Handle2(float)"); } //与父类函数的同名函数构成了函数隐藏 void Handle3(float x) { printf("base::Handle3(float)"); } //与子类中的同名函数构成函数同在,作用域、函数名、作用域相同 void Handle3(double x) { printf("base::Handle3(double)"); } }; int main(int argc,char* argv[]) { Derived DervObj; base *pbase = &DervObj;//子类对象指针强转为父类指针 Derived *pDerv= &DervObj;//将子类变换为指针形式 base baseObj; base *pbase2 = &baseObj; //间接调用,查子类虚表,子类对象有函数覆盖,调用子类的Handle1 pbase->Handle1(3.14f); //Handle1虚函数,pbase2为指针,间接调用:看对象,查父类的虚表,调用父类Handle1 pbase2->Handle1(3.14f); //有类域限制,直接调用:查找base作用域中的Handle1,调用父类Handle1(函数重载) //找到最佳匹配的函数 // (i)找到多个则提示二义性 // (ii)找不到则向该类域的上一层查找(父类) // 一旦在某一个类域中找到该函数,则不会向上查找(函数隐藏规则) pbase->base::Handle1(3.14f); pDerv->Handle1(3.14f); pbase->Handle2(3.14f); pDerv->Handle2(3.14f); pbase->Handle3(3.14f); pDerv->Handle3(3.14f); pDerv->Handle3(3.14); return 0; }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)