首页 > 代码库 > 重载重写与重定义

重载重写与重定义

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

函数重载实例:

#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关键字,这种父子之间的关系叫做虚函数重写,这种情况下发生多态 (动态链编 迟绑定)



重载重写与重定义