C++ 重载 覆盖(重写) 重定义(隐藏)的定义的区别

C++ 重载 覆盖(重写) 重定义(隐藏) 的定义

在这里插入图片描述

  1. 重载 overload:

重载 overload:是指在一个类里边实现诺干个函数名相同,形参列表不同的方法,返回值可以相同可以不相同。
特征:

  1. 范围:位于同一个类中
  2. 形式:函数名相同,形参列表不同,返回值可以相同可以不相同。
  3. 作用:通过不同的同名函数,实现多种不同功能
  4. 若一个重载版本的函数面前有virtual修饰,则表示他是虚函数,但他也是属于重载的一个版本
  5. 举例:构造函数就是典型的重载函数,一个类里边可以有多个构造函数,他们的特点就是函数名相同,形参列表不同。
    例如:不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用。

代码举例:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
	Student()
	{
		std::cout << "进入无参构造函数" << std::endl;
	}
	Student(int age, string name)
	{
		std::cout << "进入有参构造函数" << std::endl;
		m_age = age;
		m_name = name;
	}
	Student(Student &another)
	{
		std::cout << "进入拷贝构造函数" << std::endl;
		this->m_age = another.m_age;
		this->m_name = another.m_name;
	}
	virtual void eat(int num, string food_name)
	{
		std::cout << "进入eat函数, 食物名字: " << food_name << num << std::endl;
	}
	virtual void eat(string food_name)
	{
		std::cout << "进入eat函数, 食物名字: " << food_name << std::endl;
	}
	int m_age;
	string m_name;
};
int main()
{
	Student s1;
	s1.eat("meat");
	s1.eat(1, "food");
	Student s2(30, "cxtan");
	Student s3 = s2;
	Student s4(s2);
	system("pause");
	return 0;
}

重载运行的结果
2. 重写(覆盖)override:

override 是重写了父类的方法。一般子类重写父类的方法,函数特征相同,具体的实现内容不同。

  1. 范围:两个有继承关系的类中,一般是子类重写父类的方法
  2. 形式:函数名,形参列表,返回值都要相同,必须时候有virtual关键字修饰,不能有static关键字修饰,有static修改的方法是属于类的子类不能重写。
  3. 重写的访问修饰符可以不同,例如父类的private,子类可以protect或者public
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class People
{
public:
		
};
class Student
{
public:
};
int main()
{
	system("pause");
	return 0;
}
  1. 重定义redefining:

派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。

  1. 范围:两个有继承关系的类中,一般是子类重定义父类的方法
  2. 形式:函数的名字必须相同,对函数的返回值、形参列表无要求
  3. 注意:若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数,这个并不是重定义。
  4. 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数
  5. 派生类屏蔽了与其同名的基类函数
  6. 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏
  7. 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有关键字,此时,基类的函数被隐藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章