名字重载Name overloading

如果顶层函数有不同的签名,则函数名可以相同。
如果同一类中的函数有不同的签名,则函数名可以相同。
 
C++中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是成员函数,也可以是非成员函数。但是,定义这种重载函数时要求函数的参数或者至少有一个类型不同,或者个数不同。而对于返回值的类型没有要求,可以相同,也可以不同。
 
class C
{
public:
C( )
{

} // default constructor
C( int x )
{

} // convert constructor
};
void print( double d );
void print( char * );
int main( )
{
C c1,c2();//编译过程中绑定函数调用和对应的函数体
print( 100.123);
print( “100.123” );
}

名字覆盖、重置 Name overriding

若基类方法 B::m 和派生类方法 D::m 具有相同的函数签名,且基类方法 B::m 是 virtual 方法,则 D::m  重置了 B::m。
当通过基类指针或引用访问被重置的方法 m 时,需要运行时动态绑定。
覆盖(override)是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用派生类中该同名函数时会自动调用派生类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。
 
class B
{
public:
virtual void m( )
{

}
};
class D : public B
{
public:
void m ()//重置了基类方法,仍然为虚函数
{

}
};
int main( )
{
B*p= new D;
p -> m(); // 动态绑定 D::m()
return ;
}
class B
{
public:
void m( )//非虚函数,采用静态绑定
{

}
};
class D : public B
{
public:
void m ( )
{

}
};
int main( )
{
B* p=new D;
p ->m( ); //静态绑定 B::m()
return ;
}
名字覆盖、重置 Name overriding 条件
在父、子类的函数,即存在继承体系结构。
父类中标为virtual的成员函数。函数名字相同,参数相同。
通过父类的指针或是引用 指向或引用 一个对象,并调用虚函数。
 

名字隐藏  Name hiding

若基类 B 定义了非虚方法 m,同时其派生类 D 也定义了方法m,此时,我们说派生类方法 D::m 隐藏了继承自基类的同名方法 B::m 。
class B
{
public:
void m(int x)
{

}
};
class D : public B
{
public:
void m ( )//由于函数签名不同,所以二者不构成重置。
{

}
};
int main( )
{
D d1 ;
d1.m(); // invokes D::m()
d1.m(); // ERROR
d1.B::m(); // OK
return ;
}
由于函数签名不同,所以二者不构成重置。D::m隐藏了B::m
 
 
n函数同名的一般理由如下:
 
1.以Top-level函数形式定义时,形成重载,表示他们完成相同的概念操作;
2.同一个类中的非构造函数,若同名则形成重载,表示他们完成相同的概念操作;
3.一个类存在多个构造函数:default constructor, copy constructor, convert constructer, …
4.在一个类继承层次中,为支持方法多态,由基类定义虚函数,在派生类中重新定义-重置。
 

C++ 名字重载、隐藏、覆盖的更多相关文章

  1. C++中的虚继承 & 重载隐藏覆盖的讨论

    虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1. ...

  2. C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态

    class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...

  3. C++类成员函数的重载、覆盖和隐藏区别?

    C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...

  4. java的重载、覆盖和隐藏的区别

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...

  5. java中重载、覆盖和隐藏三者的区别分析

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...

  6. c++中的隐藏、重载、覆盖(重写)

    转自c++中的隐藏.重载.覆盖(重写) 1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是 ...

  7. 【转】c++重载、覆盖、隐藏——理不清的区别

    原文网址:http://blog.sina.com.cn/s/blog_492d601f0100jqqm.html 再次把林锐博士的<高质量c++编程指南>翻出来看的时候,再一次的觉得这是 ...

  8. c++重载、覆盖和隐藏

    看以前的:http://www.cnblogs.com/youxin/p/3305688.html 答案:a.成员函数被重载的特征:overload(1)相同的范围(在同一个类中):(2)函数名字相同 ...

  9. C++:类成员函数的重载、覆盖和隐藏区别?

    #include <iostream> class A { public: void func() { std::cout << "Hello" <& ...

随机推荐

  1. http并发访问模型(2)

    目录 http并发 并发访问模型 响应流程 从IO的角度看待响应 从函数的角度看待响应 日志处理 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网 ...

  2. 网页前端之CSS学习记录总结篇

    标签: 块级标签block:div, p, h1-h6, ul, ol,li, dl, dt, dd,table,tr等,独占一行,可以设置宽高,默认是父标签的100%:行内标签inline:a,sp ...

  3. @Transactional注解失效

    一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...

  4. 一起学Android之Xml与Json解析

    概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...

  5. Selenium(六):frame切换、窗口切换

    1. 切换到frame index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  6. JPA的entityManager的find方法与getReference方法的区别

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  7. 设计好的报表是如何在 web 上显示的

    润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...

  8. iOS与JS交互-WKWebView

    iOS移动端应用中,一般都会嵌入网页,在网页中处理的结果需要反馈给iOS让移动端做出相应的处理(例如页面跳转), 1.webview的配置 2.代理方法中拿到事件进行处理 二.JS中的配套出发事件 当 ...

  9. 【Gradle】Gradle任务

    Gradle任务 多种方式创建任务 1.直接以一个任务名字创建一个任务的方式: def Task task1 = task(task1) task1.doLast{ println 'task1' } ...

  10. Django源码安装xadmin报错Apps aren't loaded yet.

    环境:python2.7, django1.9 1.报错django.core.exceptions.AppRegistryNotReady:Apps aren't loaded yet.如下图所示: ...