iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅析C++中的重载,隐藏和覆盖
  • 327
分享到

浅析C++中的重载,隐藏和覆盖

C++重载 隐藏 覆盖C++重载C++ 隐藏C++ 覆盖 2022-12-08 20:12:52 327人浏览 薄情痞子
摘要

重载关系 一组函数要重载,必须处在同一个作用域中 ,而且函数名字相同,参数列表不同 代码1中的Base中的 show() 和show(int) 属于重载 代码2中的Base中的 sh

重载关系

一组函数要重载,必须处在同一个作用域中 ,而且函数名字相同,参数列表不同

代码1中的Base中的 show() 和show(int) 属于重载

代码2中的Base中的 show() 和Derive中的show()不属于重载不在同一个作用域下面

隐藏的关系(主要是指作用域隐藏)

在继承结构当中,派生类的同名成员,把基类的同名成员给隐藏掉了
例如代码2中的 Derive中的show() 和Base()中的show() ,show(int) 是隐藏关系

代码1

class Base
{
public:
	Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){

     Derive d(20); 
     d.show(); //正常调用基类show()
     d.show(100); //正常调用基类show(int)
     return 0;

}

代码2

class Base
{
public:
        Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	   Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	   }
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){

     Derive d(20);
     d.show();   //调用子类show()
     d.show(100);//调用报错 报错信息 "Derive::show()函数不接受1个参数"
     // 即 Derive中的show()方法把Base中的show()和show(int)都给隐藏掉了
     // 所以d.show()没问题,调用的是派生类的show(),但是d.show(100)报错了,因为
     // 父类的show()和show(int)都被隐藏了,而派生类Derive中没有 show(int)方法所以报错了
     // 如果想调用父类的show(int) 要这样写 d.Base.show(100);
     return 0;

}

基类对象 -> 派生类对象

类型由上向下转 NOT OK

Base b(10);
Derive d(20);
d=b;// NOT OK

派生类对象 ->基类对象

类型由下向上转 OK

Base b(10);
Derive d(20);
b=d;//OK

派生类指针(引用) ->基类指针 类型由下向上转 OK

Base b(10);
Derive d(20);
Base *pb =&d;// OK 如下图, 基类指针只能访问到基类那一部分的成员,所以是安全

代码3

class Base
{
public:
        Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
     public:
	Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	}
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){
Base   b(10);
Derive d(20);
Base  *pb =&d;
pb->show();    //调用的是基类的 show 
pb->show(100);//调用的是基类的 show(int)

((Derive *)pb)->show();    //强转后 调用的是派生类的 show 


}

基类指针(引用) -> 派生类对象 类型由上向下转 NOT OK

Base b(10);
Derive d(20);
Derive *pb =&b;// NOT OK pb指针能够访问的区域超过了实际对象b的内存块 ,危险访问

代码4

#include <iOStream>
using namespace  std;

class Base{

public:
  Base(){
     cout<<"Base()"<<endl;
  }
  void show(){
     cout<<"Base show()"<<endl;
  }
  void show(int x){
     cout<<"Base show(int x)"<<endl;
  }
  ~Base(){
     cout<<"~Base()"<<endl;
  }

private:
     int ma;

};


class Derive :public Base{

public:
  Derive(){
     cout<<"Derive()"<<endl;
  }

  void show(){
     cout<<"Derive show()"<<endl;
  }

  ~Derive(){
     cout<<"~Derive()"<<endl;
  }

private:
     int ma;

};

int main(){

    Derive d;
    Derive *pd=&d;
    d.show();
    d.show(100);  //编译报错, Derive 的void show()方法把Base 的void show() void show(int x) 都隐藏了
    pd->show(100);//编译报错  Derive 的void show()方法把Base 的void show() void show(int x) 都隐藏了
    return 0;
}

代码5

#include <iostream>

using namespace  std;

class Base{

public:
  Base(){
     cout<<"Base()"<<endl;
  }

  virtual void show(){
     cout<<"Base show()"<<endl;
  }
  void show(int x){
     cout<<"Base show(int x)"<<endl;
  }
  ~Base(){
     cout<<"~Base()"<<endl;
  }

private:
     int ma;

};



class Derive :public Base{

public:
  Derive(){
     cout<<"Derive()"<<endl;
  }

  virtual void show(){
     cout<<"Derive show()"<<endl;
  }

  ~Derive(){
     cout<<"~Derive()"<<endl;
  }

private:
     int ma;

};



int main(){

    Derive *pd=new Derive();
    pd->show(100); //编译报错,Derive 中的show() 函数,只要名字与Base中有相同名字的函数的,就会隐藏掉Base中所有的show方法(不管加不加virtual),包括void show() void show(int x)

    return 0;

}

到此这篇关于浅析c++中的重载,隐藏和覆盖的文章就介绍到这了,更多相关C++重载 隐藏 覆盖内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅析C++中的重载,隐藏和覆盖

本文链接: https://www.lsjlt.com/news/174555.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析C++中的重载,隐藏和覆盖
    重载关系 一组函数要重载,必须处在同一个作用域中 ,而且函数名字相同,参数列表不同 代码1中的Base中的 show() 和show(int) 属于重载 代码2中的Base中的 sh...
    99+
    2022-12-08
    C++重载 隐藏 覆盖 C++重载 C++ 隐藏 C++ 覆盖
  • C++中的覆盖和隐藏详解
    目录1. 前言2. 共性3. 区别4. 区分5.参考文章总结1. 前言 继承是面向对象编程的重要特性,在c++中,当父类与子类出现同名函数时,会出现两种情况:覆写和隐藏,本文主要讨论...
    99+
    2024-04-02
  • C++函数重载、隐藏与覆盖重写的精通指南
    前言 对于C++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样...
    99+
    2024-04-02
  • C++成员函数的重载,继承,覆盖和隐藏是什么
    这篇文章主要介绍“C++成员函数的重载,继承,覆盖和隐藏是什么”,在日常操作中,相信很多人在C++成员函数的重载,继承,覆盖和隐藏是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++成员函数的重载,继承...
    99+
    2023-06-17
  • C++函数重载、隐藏与覆盖重写的方法是什么
    这篇文章主要介绍了C++函数重载、隐藏与覆盖重写的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载、隐藏与覆盖重写的方法是什么文章都会有所收获,下面我们一起来看看吧。1 函数重载定义:C+...
    99+
    2023-06-29
  • C++ 函数的重载和覆盖
    c++++ 中重载和覆盖是不同的概念。重载允许创建同名函数,具有不同的参数列表,而覆盖允许派生类函数覆盖基类同名函数。在重载中,函数名相同,但参数列表不同,在覆盖中,函数名和参数列表必须...
    99+
    2024-04-12
    重载 覆盖 c++
  • C++ 中的函数重载和函数覆盖
    c++++ 中,函数重载允许创建具有相同名称但不同参数列表的函数。函数覆盖发生在派生类中,派生类中定义的函数与基类中同名函数覆盖基类的方法。 C++ 中的函数重载和函数覆盖 引言 函数...
    99+
    2024-04-14
    函数重载 函数覆盖 c++
  • C++覆盖和重载的区别是什么
    这篇文章主要讲解了“C++覆盖和重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++覆盖和重载的区别是什么”吧!1、覆盖覆盖也称为重写(override)。覆盖是存在类中,子...
    99+
    2023-06-16
  • C++深入探究重载重写覆盖的区别
    目录基类实现子类实现函数调用总结资源链接基类实现 我们先实现一个基类 class BaseTest { private: virtual void display() { c...
    99+
    2022-11-13
    C++ 重载 C++ 重写 C++ 覆盖
  • C++填坑的重写,重载和隐藏的详解
    目录重写重载隐藏总结重写 重写的定义:重写发生在基类和派生类的继承关系之中,被定义为虚函数的基类成员函数,由派生类进行重新定义和实现,同时隐藏掉基类的方法(即派生类调用该重...
    99+
    2024-04-02
  • C#中隐藏、重写、重载的区别是什么
    这篇文章主要讲解了“C#中隐藏、重写、重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中隐藏、重写、重载的区别是什么”吧!C#重载、C#重写和C#隐藏的定义C#重载:同一个...
    99+
    2023-06-17
  • C#中重写及覆盖的区别有哪些
    这篇文章主要介绍了C#中重写及覆盖的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中重写及覆盖的区别有哪些文章都会有所收获,下面我们一起来看看吧。1. 重写和覆盖的定义1.1 重写(overrid...
    99+
    2023-07-05
  • python中的类class: 继承、覆盖、重写、重载、扩展、多态、封装
    一、python中的类 使用 class 关键字创建类。类中有方法、属性。 1.1 __init__() 函数 类的内置 __init__() 函数。所有类都有一个名为 __init__() 的函数,它在启动类时执行。 使用 __init_...
    99+
    2023-09-14
    python class类
  • C++ 函数重写:揭开继承中的行为覆盖秘籍
    当派生类定义同名且实现不同的函数时,发生函数重写。规则包括:使用 override 关键字。名称、参数和返回类型与基类函数相同。访问权限不得低于基类函数。通过重写,派生类可以覆盖基类行为...
    99+
    2024-04-30
    c++ 函数重写
  • 重定向:Go 和 JavaScript 中的隐藏技巧?
    很多程序员都非常熟悉 Go 和 JavaScript 这两种编程语言。这两种语言都有很多隐藏的技巧,可以让程序员更加高效地编写代码。在本文中,我们将探讨 Go 和 JavaScript 中的一些隐藏技巧,帮助读者更好地利用这两种语言。 Go...
    99+
    2023-06-17
    javascript shell 重定向
  • 浅析css隐藏div块的实现方法和应用场景
    CSS的隐藏功能在网页设计中起着重要的作用,尤其是在实现动态效果的过程中。在这个过程中,隐藏Div块是经常用到的一种方法。本文将为大家介绍CSS隐藏Div块的实现方法和应用场景。一、CSS隐藏Div块的实现方法display属性displa...
    99+
    2023-05-14
  • 浅谈java中的重载和重写的区别
    目录1.重载小结:2.重写小结:总结1.重载 重载指在一个类中,具有多个相同名称的方法,他们的参数列表却不相同 (参数类型不同、参数个数不同甚至是参数顺序不同) 重载对返回类型没有要...
    99+
    2024-04-02
  • C# 中override重写与new隐藏的区别是什么
    这期内容当中小编将会给大家带来有关C# 中override重写与new隐藏的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#比java多一个new隐藏的功能。C# override重写相当于j...
    99+
    2023-06-17
  • 解析CSS中元素的显示和隐藏技术
    CSS中的元素显示和隐藏技术解析 在网页开发中,经常会遇到需要动态控制元素的显示和隐藏的需求。CSS提供了多种方法来实现这一功能,本文将详细解析这些技术,并提供具体的代码示例。 一、display属性 display: none...
    99+
    2024-02-02
    css隐藏技术 元素可见性 css显示控制
  • C++ 函数重载的解析和优先级
    函数重载允许创建具有相同名称但参数列表不同的多个函数。解析:将多个同名函数定义到同一名称空间中,每个重载必须具有独特的参数列表。优先级:选择要调用的函数时,编译器按照以下优先级进行匹配:...
    99+
    2024-04-13
    c++ 函数重载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作