c++ 覆盖、重载、隐藏
函数重载:
1、相同的范围内(即同一类中)
2、函数名相同;
3、参数不同;
4、virtual关键字可有可无;
函数覆盖:虚函数的功能、动态多态
(父类中必须有virtual)========派生类函数 覆盖掉 基类函数;
指派生类中存在重新定义的函数,其函数名、参数、返回值类型必须同父类中相对应被覆盖的函数严格一致。覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同。
当派生类对象调用子类该同名函数会自动调用子类中的函数,而不是父类中的版本,这个机制就叫做覆盖;
1、不同的范围内(分别在 基类 和 派生类中)
2、函数名相同;
3、参数相同;
4、virtual关键字必须有;
隐藏:
隐藏是指派生类的函数屏蔽了与其同名的基类函数;
A、派生类的函数与基类的函数同名,但是参数不同。不论有无virtual,基类的函数将被隐藏;=======<区别: 重载>
B、派生类的函数与基类的函数同名,参数相同,必须没有virtual,基类的函数被隐藏;=========<区别:覆盖>
#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(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; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
Derived::f(float x)覆盖Base::f(float x) //不同范围,参数相同,函数名相同,有关键字virtual ----------覆盖
Derived::g(int x)隐藏Base::g(float x) //不同范围,参数不同,函数名相同,无关键字virtual----------隐藏
Derived::h(float x)隐藏Base::h(float x) //不同范围,参数相同,函数名相同,但是无virtual-----------隐藏
void main(void)
{
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
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 (surprise!) // Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}
在第一种调用中,函数的行为取决于指针所指向的对象。
在第二、三种调用中,函数的行为取决于指针的类型。
所以说,隐藏破坏了面向对象编程中多态这一特性,会使得OOP人员产生混乱。
不过隐藏也并不是一无是处,它可以帮助编程人员在编译时期找出一些错误的调用。但我觉得还是应该尽量避免使用隐藏这一些特性,该加virtual时就加吧。
c++ 覆盖、重载、隐藏的更多相关文章
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- java的重载、覆盖和隐藏的区别
重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...
- C++中的虚继承 & 重载隐藏覆盖的讨论
虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1. ...
- 【转】c++重载、覆盖、隐藏——理不清的区别
原文网址:http://blog.sina.com.cn/s/blog_492d601f0100jqqm.html 再次把林锐博士的<高质量c++编程指南>翻出来看的时候,再一次的觉得这是 ...
- 【转】重载(overload),覆盖(override),隐藏(hide)的区别
原文网址:http://www.cppblog.com/zgysx/archive/2007/03/12/19662.html 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖 ...
- c++重载、覆盖和隐藏
看以前的:http://www.cnblogs.com/youxin/p/3305688.html 答案:a.成员函数被重载的特征:overload(1)相同的范围(在同一个类中):(2)函数名字相同 ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
- C++中的重载、覆盖、隐藏
前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪.引用的 ...
- c++(重载、覆盖、隐藏)
源地址:http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏 ...
- 【非原创】C++类成员函数的重载、覆盖和隐藏
链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐 ...
随机推荐
- larbin源码之global.h
/** This represent a connection : we have a fixed number of them * fetchOpen links them with servers ...
- easyui datagrid 列的内容超出所定义的列宽时,自动换行
定义表单 nowrap="false"可以使得列中的内容超出所定义的列宽是就会自动换行pagination : true, // 当true时在DataGrid底部显示一个分页工 ...
- poj2871
#include <stdio.h> #include <stdlib.h> //法一 int main() { ]; ,tmp; ) { scanf("%lf&qu ...
- UberX及以上级别车奖励政策(优步北京第一组)
优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机( ...
- 面向对象程序设计-C++_课时21引用
数据类型 & 别名=对象名; #include <iostream> using namespace std; int * f(int * x) { (*x)++; return ...
- nodejs开发微信1——微信路由设置a(access_token和tickets)
/* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...
- 魔兽世界---屠夫(Just a Hook)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- dijkstra 优先队列最短路模板
;;*maxn];,):id(a),dist(b){} )); ;i<=n;i++)dist[i]=inf; dist[st]=; ;i= ...
- [LeetCode] Search a 2D Matrix [25]
题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the fo ...
- oracle添加用户及权限
CREATE USER qdcenter 用户名 IDENTIFIED BY qdcenter 密码 DEFAULT TABLESPACE data1 默认表空间 TEMPORARY TABLE ...