函数重载重写重定义

一.首先问题的引出

看如下代码,方便分析说明给函数编号

class parent
{
public:
	//1.virtual void fun()
	{
		cout << "parent->fun()..." << endl;
	}
	//2.virtual void fun(int i)
	{
		cout << "parent->fun(int i)  " << i << endl;
	}
	//3.virtual void fun(int i, int j)
	{
		cout << "parent->fun(int i,int j) " << i << j << endl;
	}
};
class child:public parent
{
public:
	//4.virtual void fun(int i, int j)
	{
		cout << "child->fun(int i,int j) " << i << j << endl;
	}
	//5.virtual void fun(int i, int j, int k)
	{
		cout << "child->fun(int i,int j,int k)" << endl;
	}
};
int main()
{
	child c1;
	c1.fun();
	system("pause");
	return 0;
}
这样看的话会有点蒙圈,那简单的看下面这个示意图


有几个问题:

1.为什么会出现这个错误?

2.子类中的fun函数和父类中的fun函数是什么关系?

下面经过上面 的例子后我们看看真正的概念

二.函数重载与函数重写

1.函数重载:必须在同一个类中进行
                       子类无法重载父类函数
                       父类同名函数将被名称覆盖
                       重载是在编译器期间根据函数参数类型和个数决定函数的调用
2.函数重写:1.必须发生在父类与子类之间
                       2.并且父类和子类中的函数有完全相同的原型
                       3.使用virtual关键字声明之后能够产生多态(如果不使用virtual的重写,那叫重定义)
                       4.多态是在运行期间根据具体对象的类型决定函数调用
通过对上述概念的理解,我们来看上述代码的问题
①1,2,3为函数重载;4,5为重载函数
②3,4为函数重写
③如果去掉virtual关键字,3,4就是非虚函数重写,即重定义
现在看发生刚才错误的原因:  子类无法重载父类函数,  父类同名函数将被名称覆盖。
因为父类中的fun被子类中的fun覆盖,占用了父类fun函数的位置,编译器开始在子类中找fun()无参函数,没有找到,所以出现错误。
那么怎么解决呢?
加上域作用符就好了。
int main()
{
	child c1;
	c1.parent::fun();
	system("pause");
	return 0;
}

                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值