c++继承过程函数重载重写重定义

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
using namespace std;
//重写 重载 重定义
//重写发生在2个类之间
//重载必须在一个类之间
/*
1 函数重载概念
函数重载(Function Overload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同

2 函数重载的判断标准

函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
*/
//重写分为2类,必须在有继承的两个类之间发生
//1 虚函数重写  将发生多态
//2 非虚函数重写 (重定义)子类函数

class Parent
{
public:
	void abc()
	{
		cout << "我是父类abcdefg" << endl;
	}
	virtual void func() //这三个函数是重载,都是属于父类的函数
	{
		cout << "function() finished" << endl;
	}
	virtual void func(int i)
	{
		cout << "function() finished"<<"i="<<i << endl;
	}
	virtual void func(int i,int j)
	{
		cout << "function() finished" << "i=" << i <<"j="<<j<< endl;
	}
	virtual void func(int i,int j,int k,int m)
	{
		cout << "function() finished" << "i=" << i << "j=" << j<<"k="<<k <<"m="<<m<< endl;

	}
};

class Chilid:public Parent
{
public:
	void abc()
	{
		cout << "我是子类的abc函数,我在子类中被重写了" << endl;
	}
	virtual void func(int i, int j) override//父类有一个两个形式参数的func函数,这是重写
	{
		cout << "我是子类的重写virtual function() " << "i=" << i << "j=" << j << endl;

	}
	virtual void func(int i, int j, int k)//与本类的函数构成重载,但是与父类的函数不是重定义--(参数的个数改变了)
	{
		cout << "子类重写的func函数,有3个参数 "<< "i="<< i << "j=" << j << "k=" << k << endl;
	}
};
int main(void)
{
	Chilid c1;
	//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置
	//因为子类中已经有了func名字的重载形式。。。。
	//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数 
	//c1.func();//error C2661: “Chilid::func”: 没有重载函数接受 0 个参数
	c1.abc();//调用的子类的abc()函数
	Parent p1;//调用父类的abc()函数
	p1.abc();
	//子类无法重载父类的函数,父类同名函数将被名称覆盖
	c1.Parent::abc();//显示调用父类的函数


	//1 C++编译器 看到func名字 ,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数
	//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.
	//3 C++编译器开始报错.....  error C2661: “Child::func”: 没有重载函数接受 4 个参数
	//4 若想调用父类的func,只能加上父类的域名..这样去调用..
	c1.Parent::func(1, 2, 3, 4);
	system("pause");
	return 0;
}
/*
函数重载
		必须在同一个类中进行
		子类无法重载父类的函数,父类同名函数将被名称覆盖
		使用子类对象调用是调用子类的函数,使用父类对象调用是调用父类的函数
		重载是在编译期间根据参数类型和个数决定函数调用
		
函数重写
		必须发生于父类与子类之间(必须要有继承)
		并且父类与子类中的函数必须有完全相同的原型
		使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
		(父类指针指向子类或者父类对象,自动判定调用父类还是子类的成员函数)
		多态是在运行期间根据具体对象的类型决定函数调用
我们说函数重写-就是指虚函数重写
==========================================================================
		我是子类的abc函数,我在子类中被重写了
		我是父类abcdefg
		我是父类abcdefg
		function() finishedi=1j=2k=3m=4
		请按任意键继续. . .

 */

猜你喜欢

转载自blog.csdn.net/baixiaolong1993/article/details/89205176
今日推荐