C++之重载 重定义与重写用法详解

一、重载(重载函数)

重载函数是C++为了方便使用,允许在同一范围中(一个类中)声明几个功能类似的同名函数,但是这些同名函数的形参(指参数的个数、类型或者顺序至少有一个)必须不同

1、代码实现在一个类中fun()函数的重载:

#include<iostream>
using namespace std;

class Base
{
public:
	void fun()
	{
		cout << "Base::fun()" << endl;
	}
	void fun(int a)
	{
		cout << "Base::fun(int)" << endl;
	}
	void fun(int a, float b)
	{
		cout << "Base::fun(int,float)" << endl;
	}
};
void main()
{
	Base c;
	c.fun();
	c.fun(1);
	c.fun(1, 1.0);
}

2、运行程序之后的打印

二、重定义(函数同名隐藏)

如果一个类,存在和父类相同的函数(此处指函数名相同,对返回类型、形参没有要求),那么,这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的,此方法称为重定义。(bb太多文字怕看官老爷晕乎乎,直接上代码)

1、代码实现在两个类中分别定义一个函数(函数名要求相同):

class Base
{
public:
	void fun()
	{
		cout << "Base::fun()" << endl;
	}
};
class D :public Base
{
public:
	void fun(int)
	{
		cout << "D fun(int)" << endl;
	}
};
int main()
{
	D d;
	//d.fun() 如果这样调用 系统会提示缺少参数
	d.fun(1);//同名隐藏,此时调用的是子类中的fun函数
	//如果想调用父类对象,下面的语句可以帮你实现,你需要指出调用的是谁的fun
	d.Base::fun();

}

2、运行程序之后的打印

三、重写(覆盖)

子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,也就是子类重新定义父类中有相同名称和参数的虚函数(virtual),这就需要采用方法的重写。方法重写又称方法覆盖。

1、代码实现在子类重写父类虚函数:

class Person
{
public:
	virtual void Eat()
	{
		cout << "Person Eat food" << endl;
	}
	virtual void sleep()
	{
		cout << "Person sleep " << endl;
	}
	void study()
	{
		cout << "We need study" << endl;
	}
};
class Lily:public Person
{
public:
	virtual void Eat()
	{
		cout << "Lily Eat dumpling" << endl;
	}
	virtual void sleep()
	{
		cout << "Lily sleeps and dreams " << endl;
	}
};
void main()
{
	Lily L;
	/*子类对象不能直接调用被重写的方法
	因为对D实例化的对象来说重写的函数覆盖掉了父类的虚函数
	*/
	Person *pr = &L;
	pr->Eat();
	pr->sleep();
	L.study();
}

2、运行程序之后的打印

我们看完三个方法的实现之后来做一个横向比较:

函数 特点
函数重载 在同一个类中,同名函数形参的个数、类型、顺序至少有一个不同
重定义(同名隐藏) 子类中存在和父类相同的函数(此处指函数名相同,对返回类型、形参没有要求),屏蔽了父类的同名函数
重写(覆盖) 子类对父类继承的虚函数内容想做一定的修改

到此这篇关于C++之重载 重定义与重写用法详解的文章就介绍到这了,更多相关C++之重载 重定义与重写内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈C++重载、重写、重定义

    一.重载(overload) 指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断. (1)相同的范围(在同一个作用域中) : (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. (5)返回值可以不同: 二.重写(也称为覆盖 override) 是指派生类重新定义基类的虚函数,特征是: (1)不在同一个作用域(分别位于派生类与基类) : (2)函数名字相同: (3)参数相同: (4)基类函数必须有 virtual 关键字,不能有 static

  • 一篇文章带你了解c++运算符重载

    目录 友元函数 重载:复合赋值 Operator pairings 自增自减运算符的重载 c++20,spaceship operator 总结 友元函数 一种全局函数,可以在类里声明,其他地方定义.或者在类里定义生命. 但是这个友元函数,不是类的成员.用的时候直接用,但是可以接触类的所有权限的变量. 对于,重载操作符来说,可以把一些重载体函数定义为友元函数. 具体来说,如果进行运算的这两个类,是对等的,没有修改任一个的值,那么,建议用友元. 如果,类似=,是赋值,对左边的变量做修改了.那么这时

  • C++中运算符重载详解及其作用介绍

    目录 概述 函数重载 运算符重载 C++ 的运算符 重载运算符的规则 成员函数实现 Complex 加法 运算符重载的方法 多种实现方法 实现 operator+= 三种运算符重载函数 成员函数实现 友元函数实现 输出结果 重载单元运算符 例子 重载二元运算符 例子 重载 I/O 插入运算符 << 提取运算符 >> 总结 概述 运算符重载 (Operator Overloading) 函数重载 重载: 将同一名字重新赋予新的含义. 函数重载: 对一个函数赋予新的含义, 使之实现新功

  • 基于C++类型重定义的使用详解

    这几天工作时碰到一个C++的编译错误(我使用的是Visual C++ 7.0),说是有一个类重复定义,仔细想想我们的这个项目也是做了好几个Release了, 内部代码应该不会有这样的低级错误, 真把类型给重复定义了,检查结果正如我预料的一样. 就这样, 我左右没找到原因,被一个编译错误给卡在那里了.(在我的概念中, 程序错误的等级为:编译错误->链接错误->逻辑错误, 此错误属于最低级 ).这时我仔细看了一下错误提示, 发现重复定义是由于从两个不同的路径包含了同一个头文件而引起的,同事也建议从

  • C++之重载 重定义与重写用法详解

    一.重载(重载函数) 重载函数是C++为了方便使用,允许在同一范围中(一个类中)声明几个功能类似的同名函数,但是这些同名函数的形参(指参数的个数.类型或者顺序至少有一个)必须不同 1.代码实现在一个类中fun()函数的重载: #include<iostream> using namespace std; class Base { public: void fun() { cout << "Base::fun()" << endl; } void fu

  • PHP设计模式之装饰器模式定义与用法详解

    本文实例讲述了PHP设计模式之装饰器模式定义与用法.分享给大家供大家参考,具体如下: 什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这

  • C++ operator关键字(重载操作符)的用法详解

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,"功能"都是由函数实现的). 一.为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,

  • PHP设计模式之适配器模式定义与用法详解

    本文实例讲述了PHP设计模式之适配器模式定义与用法.分享给大家供大家参考,具体如下: 适配器很容易理解, 大多数人家庭都有手机转接器, 用来为移动电话充电,这就是一种适配器. 如果只有USB接头, 就无法将移动电话插到标准插座上. 实际上, 必须使用一个适配器, 一端接USB插头, 一端接插座. 当然, 你可以拿出电气工具,改装USB连接头, 或者重新安装插座, 不过这样会带来很多额外的工作, 而且可能会把连接头或插座弄坏. 所以, 最可取的方法就是找一个适配器. 软件开发也是如此. 类适配器模

  • Java设计模式之策略模式定义与用法详解

    本文实例讲述了Java策略模式定义与用法.分享给大家供大家参考,具体如下: 一. 定义: 定义一系列算法,把他们一个一个封装起来,并且使他们可以相互替换. 二. 优点: (1)上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系,因此上下文只需要知道他要使用某一个实现  Strategy接口类的实例,但不需要知道是哪个类. (2)策略模式满足开闭原则,当增加新的具体类时,不需要修改上下文类的代码,上下文即可以引用新的具体策略的实例. 三. 实例: 下面就通过一个问题

  • Java开发中synchronized的定义及用法详解

    概念 是利用锁的机制来实现同步的. 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问.互斥性我们也往往称为操作的原子性. 可见性:必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致. 用法 修饰静态方法: //同步静态方法 public synchronized

  • Java基础之重载(Overload)与重写(Override)详解

    一.重载(Overload) 重载是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 最常用的地方就是构造器的重载. 重载的好处: 1.不用为了对不同的参数类型或参数个数,而写多个函数. 2.多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数. 3.重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Python装饰器(decorator)定义与用法详解

    本文实例讲述了Python装饰器(decorator)定义与用法.分享给大家供大家参考,具体如下: 什么是装饰器(decorator) 简单来说,可以把装饰器理解为一个包装函数的函数,它一般将传入的函数或者是类做一定的处理,返回修改之后的对象.所以,我们能够在不修改原函数的基础上,在执行原函数前后执行别的代码.比较常用的场景有日志插入,事务处理等. 装饰器 最简单的函数,返回两个数的和 def calc_add(a, b): return a + b calc_add(1, 2) 但是现在又有新

  • PHP设计模式之状态模式定义与用法详解

    本文实例讲述了PHP设计模式之状态模式定义与用法.分享给大家供大家参考,具体如下: 什么是状态设计模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 什么时候使用状态模式 对象中频繁改变非常依赖于条件语句. 就其自身来说, 条件语句本身没有什么问题(如switch语句或带else子句的语句),不过, 如果选项太多, 以到程序开

随机推荐