名字重载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. [译]Vulkan教程(16)图形管道基础之总结

    [译]Vulkan教程(16)图形管道基础之总结 Conclusion 总结 We can now combine all of the structures and objects from the ...

  2. Python 变量与运算符

    变量 基本概念: 1. 变量,名字,数据的唯一标识2.变量命名: 字母.数字.下划线: 不能以数字开头: 区分大小写: 不能使用保留字和关键字: 命名要有意义:(多个单词时,推荐使用下划线连接) 3. ...

  3. 01-Vue.js基础

    一.Vue基础 1.介绍 Vue是一套用于构建用户界面的渐进式框架.Vue的核心库只关注视图层,不仅容易上手,还便于与第三方库或既有的项目整合.兼容性:Vue 不支持 IE8 及以下版本,因为 Vue ...

  4. Web安全测试学习笔记 - DVWA+PHP环境搭建

    DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...

  5. C sharp #005# 对象与对象变量

    饮水思源:金老师的自学网站 索引 自动装箱 “只读”对象 设定启动窗体 ShowDialog与Show 自动装箱 基本类型的变量值可以自动装箱到一个object对象中, 反过来,object对象也可以 ...

  6. ADO.NET ORM数据库增删改查封装(工具一)

    约束 public abstract class BaseModel { public int Id { get; set; } } 连接字符串 public static readonly stri ...

  7. .Net Core权限认证基于Cookie的认证&授权.Scheme、Policy扩展

    在身份认证中,如果某个Action需要权限才能访问,最开始的想法就是,哪个Action需要权限才能访问,我们写个特性标注到上面即可,[TypeFilter(typeof(CustomAuthorize ...

  8. kafka cmd首个单机例子配置

    下载地址:http://kafka.apache.org/downloads       http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.12- ...

  9. PHPStudyLite启动不成功怎么办

    点击环境端口检测 有端口打开则关闭 一切正常后重新开启

  10. Java - IO 内存流和打印流

    IO 内存流和打印流操作 字符编码 计算机中所有的信息组成都是二进制数据,所有能够描述的中文文字都是经过处理后的结果:所有的语言文字都会使用编码来进行描述,例如:ASCII码 常见编码 GBK/GB2 ...