重载重写与重定义

重载:重载是指在一个类或者作用域中可以出现多个函数名相同参数不同的函数,重载可以分为函数重载和运算符载

函数重载实例:

#include <iostream>

using namespace std;

//比较两个int型数的大小,并且返回最大的数
int max(int a, int b)
{
    int c;

    c = (a > b) ? a : b;

    return c;
}

//比较两个double型数的大小,并且返回最大的数
double max(double a, double b)
{
    double c;

    c = (a > b) ? a : b;

    return c;
}

//比较两个字符的大小,并且返回最大的字符
char max(char a, char b)
{
    char c;

    c = (a > b) ? a : b;

    return c;
}

void main()
{
    cout<<"最大的int型数:"<<max(123, 23)<<endl;
    cout<<"最大的double型数:"<<max(1.23, 2.3)<<endl;
    cout<<"最大的字符:"<<max('a', 'z')<<endl;

    system("pause");
}

执行结果:

说明:

上面的程序中使用了三个max函数,三个函数的函数名相同,函数的参数不同,这就是函数重载的运用

运算符重载:就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

至于运算符重载我在前面已经写了一些博客,详情可以看:

设计String类,并且在String类中使用运算符重载 http://blog.csdn.net/u010105970/article/details/30253771

在运算符重载中使用友元函数http://blog.csdn.net/u010105970/article/details/30025343

使用运算符重载实现复数的四则运算http://blog.csdn.net/u010105970/article/details/30022851

使用运算符重载实现复数的加法运算http://blog.csdn.net/u010105970/article/details/29855667

设计CTime类在CTime类中使用运算符重载http://blog.csdn.net/u010105970/article/details/30460881

重载<<和>>http://blog.csdn.net/u010105970/article/details/31395025

通过重载输入和输出运算符实现复数的输入和输出 http://blog.csdn.net/u010105970/article/details/31402615

在复数类中自定义类型转换函数实现复数和非复数之间的运http://blog.csdn.net/u010105970/article/details/31734497

在CTime类中重载<<和>> http://blog.csdn.net/u010105970/article/details/31745291

在类中使用函数重载:

#include <iostream>

using namespace std;

class Parent
{
public:
	void func()
	{
		cout<<"类中的 void func()"<<endl;
	}

	 void func(int i)
	{
		cout<<"类中的 void func(int i)"<<endl;
	}

	 void func(int i, int j)
	{
        cout<<"类中的 void func(int i, int j)"<<endl;
	}
};

int main()
{
    Parent p;//定义一个类对象

	p.func();
    p.func(1);
    p.func(1,2);

	system("pause");
}

执行结果:

说明:

通过这个例子说明函数重载不仅适用于作用域中,在类中也适用

重写:当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法

代码示例:

#include <iostream>

using namespace std;

class Parent//父类
{
public:
	void func()
	{
		cout<<"父类中的 void func()"<<endl;
	}

	 virtual void func(int i)
	{
		cout<<"父类中的 void func(int i)"<<endl;
	}

	 virtual void func(int i, int j)
	{
        cout<<"父类中的 void func(int i, int j)"<<endl;
	}
};

class Child : public Parent
{

public:
	virtual void func(int i, int j)
	{
		cout<<"子类中的 void func(int i, int j)"<<endl;
	}

	virtual void func(int i, int j, int k)
	{
		cout<<"子类中的 void func(int i, int j, int k)"<<endl;
	}
};

void main()
{
	Child c;
        c.func(1,2);
	c.func(1,2,3);

	system("pause");
}

执行结果:

说明:

1、必须是在继承里

2、方法名、参数个数和参数类型 都必须相同

3、j返回值类型可以与父类相同,也可以与父类不同,但是要求返回值类型是父类的子类。如: 父类的返回值类型是

4、派生类重写的方法的访问权限不能低于基类的权限

5、派生类抛出的异常应该和基类相等或比基类更小

6、如果父类中没有virtual关键字,这种父子之间的关系 重定义  (静态链编)

7、如果父类中有virtual关键字,这种父子之间的关系叫做虚函数重写,这种情况下发生多态 (动态链编 迟绑定)



时间: 2024-10-10 12:41:33

重载重写与重定义的相关文章

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别

https://blog.csdn.net/ranxiaoxu123/article/details/52291385 https://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html 原文地址:https://www.cnblogs.com/Kiven5197/p/8934207.html

C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函

重写,重定义,重载

> 重写,重定义经常与继承和虚继承一起使用,那么我们一步一步来,先看看重写,重定义到底是什么样子的呢? >重载: 1.它在同一个作用域中 2.函数名必须相同 3.参数个数,类型,顺序不同 4.返回值不作要求 5.virtual关键字不作要求 >重写(覆盖): 1.不在同一个作用域中(即基类与子类中) 2.函数名相同,返回值相同,参数也相同 3.只是在基类同名函数前必须有virtual关键字不能有static. 这时派生类的重写函数就会覆盖基类中的同名函数. >重定义(隐藏): 1.

C++重载,重写,重定义

1.重载:重载是在一个类中,函数名一样,参数类型或参数个数不同的一系列函数需要注意的是,与返回类型无关. class Test { public: void show(); void show(int a); void show(double a); void show(int a,int b); void show(int a,double b); }; 2.重写我们比较熟悉的另一个词是“覆盖”用在继承中,子类若没有重新定义父类的虚方法,则子类对象调用该方法时,使用的仍是父类的方法:否则,子类

C++ 类的多态二(函数重载--函数重写--函数重定义)

//函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子类无法重载父类的函数,父类同名函数将被子类的同名函数覆盖 重载是在编译期间根据参数类型,顺序,个数决定的函数调用 函数重写 必须发生于父类和子类之间 并且父类和子类中的函数必须有完全相同的函数签名 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类

C++中重载、重写和重定义的区别

参考博客:http://blog.sina.com.cn/s/blog_8ddc5c2e01013hbd.html 相信看到这个标题头就晕了,其实将他们彼此放到一起来看,就会比较清晰辨认了. 重载:函数名相同,函数的参数个数.参数类型或参数顺序三者中必须至少有一种不同.函数返回值的类型可以相同,也可以不相同. 重写:也叫做覆盖,一般发生在子类和父类继承关系之间.子类重新定义父类中有相同名称和参数的虚函数. 重定义:也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) ,指

C++重载、重写、重定义

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

Delphi 重载方法与重定义方法

原文地址:https://www.cnblogs.com/fanweisheng/p/11406338.html

重载重写重定义

1.重载:overload,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. class Overload{ public: void V1(int i); void V1(double i); void V1(int i, double j); void V1(double i, int j); int test(int i); //编译报错,不是重载 }; 2.隐藏(重定义):隐藏是指派生类的函数屏