名字重载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. MVC(实战一)

    一.创建MVC项目 二.界面分布 Content:是存放css文件等,暂时先不考虑. Controllers:重要, 控制层,控制界面显示和界面逻辑的,其实真正业务逻辑层,建议分层出去. Models ...

  2. C++ std::vector 基本用法2

    #include <iostream> #include <vector> using namespace std; int main() { int ar[10] = { 1 ...

  3. Codeforces Round #607 (Div. 1)

    A. Cut and Paste 题解 在计算答案的时候,我们发现只需要知道这个字符串前\(l\) 个具体是啥就行了.所以对于每一组询问,我们暴力把这个字符串前\(l\) 的位都算出来,然后剩下的就推 ...

  4. 配置 Elasticsearch 集群

    Elasticsearch 的安装非常简单,笔者在前文<单机部署 ELK>中已经介绍过了,本文主要介绍集群的配置,并解释常见配置参数的含义. 要配置集群,最简单的情况下,设置下面几个参数就 ...

  5. 关于 Comparable 的使用

    作为一名刚上路的超初级程序员,今天终于可以迈开自己的第一步,写一篇博客.把我自己都感动哭了. 今天看面试题时看到了一个Comparable 的使用,才发现自己好像并没有使用过这个接口,具体这个接口是怎 ...

  6. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  7. sprintf函数 (字符格式化函数)

    sprintf函数 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中. sprintf函数原型在<studio.h>中. sprintf( [指向输入格式化后的字符串的缓冲区的指 ...

  8. Java中String直接赋字符串和new String的一些问题

    今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: https://www.cnblogs.com/marsitman/p/11248001.html htt ...

  9. C++ 面向对象程序设计复习大纲

     这是我在准备C++考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题会 ...

  10. 如何使用SpringBoot封装自己的Starter

    作者:Sans_ juejin.im/post/5cb880c2f265da03981fc031 一.说明 我们在使用SpringBoot的时候常常要引入一些Starter,例如spring-boot ...