函数重载重写重定义

一.首先问题的引出

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

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;
}

                     

函数重写重载重定义C++中不同的概念,它们的区别如下: ### 函数重写 函数重写分为虚函数重写(会发生多态)与非虚函数重写重定义的一种形式),也叫做覆盖。子类重新定义父类中有相同返回值、名称和参数的虚函数函数特征相同,但具体实现不同,主要在继承关系中出现。重写实现了运行时多态,通过基类指针或引用调用虚函数时,会根据实际对象的类型来决定调用哪个版本的函数[^1]。 ### 函数重载 重载是指在同一作用域内,可以有多个名称相同但参数列表(参数类型、参数个数或参数顺序)不同的函数或成员函数。这些函数可以是普通函数,也可以是类的成员函数。编译器会根据调用函数时实际传入的参数情况,在编译阶段就确定具体要调用的是哪个重载版本的函数,以此实现编译时多态,方便程序员针对不同的参数情况提供不同的处理逻辑[^2][^3]。 ### 函数重定义 函数重定义相对宽泛,非虚函数重写重定义的一种形式。当子类定义了与父类同名的函数,但不满足重写的条件(比如不是虚函数,或者返回值、参数不同)时,就发生了重定义重定义会隐藏父类中的同名函数,即通过子类对象只能访问到子类中定义的版本,而无法直接访问父类的版本。 以下是简单的代码示例来展示三者的区别: ```cpp #include <iostream> // 基类 class Base { public: // 虚函数,用于函数重写 virtual void func() { std::cout << "Base::func()" << std::endl; } // 用于函数重载 void func(int x) { std::cout << "Base::func(int): " << x << std::endl; } }; // 派生类 class Derived : public Base { public: // 函数重写 void func() override { std::cout << "Derived::func()" << std::endl; } // 函数重定义 void func(double x) { std::cout << "Derived::func(double): " << x << std::endl; } }; int main() { Base base; Derived derived; // 函数重载调用 base.func(); base.func(10); // 函数重写调用 Base* ptr = &derived; ptr->func(); // 函数重定义调用 derived.func(3.14); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值