博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Compare “overriding”, “overloading“ and “name hiding” in C++
阅读量:6914 次
发布时间:2019-06-27

本文共 1574 字,大约阅读时间需要 5 分钟。

C++中这几个概念非常相似,很容易混淆,在编程时也很容易导致错误

“name hiding” 是指在类的继承层次中,基类和子类共享想同名字的变量或者方法,从而导致父类的名称在子类中不可见。

这种现象在c中也很普遍,比如:

 

int iCnt = 
1
func(
int i) { 
int iCnt =
2 };
//
在这个函数中,所有和iCnt相关的操作都是使用函数的局部变量,这时外部的iCnt被隐藏。
func( iCnt );

 

下面给出一个类的实例:

 

class B1
public:
    
int nV; 
    
void fun()  {cout<<
"
Member of B1
"<<endl;}
};
class B2 
{
public
    
int nV; 
    
void fun(){    cout<<
"
Member of B2
"<<endl;} 
};
main() 
{
    B1 d1;
    d1.nV=
1;  
//
objectname.objctMember, access var in D1 
    d1.fun();
    d1.B1::nV=
2;    
//
access base class B1’s member 
    d1.B1::fun(); 

 

在上面的例子中,B2的fun方法会把父类的同名、同参方法隐藏。 如果仍需要调用父类的被隐藏方法,可以通过“父类名::"来访问,如上例所示。 "overloading”被称作函数的重载 ”overriding“又叫函数的覆盖  区别如下:
  • 函数重载指在同一个类中通过设置相同函数名称,不同的参数的多个函数实现不同的方法。
  • 函数覆盖指在父类和子类中,两个函数名称和参数完全一致,其行为却是不同的
  • 函数重载发生在编译期间
  • 函数覆盖属于动态帮顶,发生在程序运行时
  • 通过函数重载可以针对一个函数名称,根据函数的不同传入类型来多样化函数的行为
  • 通过函数覆盖可以在一个继承层次的不同类型,针对同一个函数名称,实现不同的方法
 

可以通过下面例子加深对于函数重载、覆盖的认识 

class Base
{
public:
    virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
    void g(float x){ cout << "Base::g(float) " << x << endl; }
};
class Derived : public Base
{
public:
    virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
    void g(int x){ cout << "Derived::g(int) " << x << endl; }
};
int main()
{
    Derived  d;
    Base *pb = &d;
    Derived *pd = &d;
    // Good : behavior depends solely on type of the object
    pb->f(3.14f); // Derived::f(float) 3.14 // overriding
    pd->f(3.14f); // Derived::f(float) 3.14
    
// Bad : behavior depends on type of the pointer
    pb->g(3.14f); // Base::g(float) 3.14
    pd->g(3.14f); // Derived::g(int) 3
}

 

转自:

转载于:https://www.cnblogs.com/whyandinside/archive/2012/09/12/2681244.html

你可能感兴趣的文章
ajax注册页面异步验证
查看>>
linux(VMware里)不重启添加新硬盘
查看>>
java之System类
查看>>
nginx 常用命令整理
查看>>
在路由器配置telnet
查看>>
tcp三次握手
查看>>
Tomcat基本结构和配置文件结构
查看>>
在腾讯云上把Laravel整合万向优图图片管理能力,打造高效图片处理服务
查看>>
爱创课堂每日一题八十一天-行内元素和块级元素的具体区别是什么?行内元素的pad...
查看>>
数据库(二)
查看>>
php抽奖概率算法
查看>>
20190202 week2
查看>>
漫谈Web缓存架构
查看>>
管理系统中的mysql基本应用
查看>>
高级持续威胁(APT)终结者-Log 360
查看>>
【初学小白】课程作业 11台路由器配置静态路由实现全网互通
查看>>
2019年初创软件开发公司如何快速盈利
查看>>
静态路由,默认路由
查看>>
libvirt之virt-install
查看>>
好程序员web前端分享Nodejs学习笔记之Stream模块
查看>>