C++ 重载 覆盖(重写) 重定义(隐藏) 的定义
- 重载 overload:
重载 overload:是指在一个类里边实现诺干个函数名相同,形参列表不同的方法,返回值可以相同可以不相同。
特征:
- 范围:位于同一个类中
- 形式:函数名相同,形参列表不同,返回值可以相同可以不相同。
- 作用:通过不同的同名函数,实现多种不同功能
- 若一个重载版本的函数面前有virtual修饰,则表示他是虚函数,但他也是属于重载的一个版本
- 举例:构造函数就是典型的重载函数,一个类里边可以有多个构造函数,他们的特点就是函数名相同,形参列表不同。
例如:不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用。
代码举例:
#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 是重写了父类的方法。一般子类重写父类的方法,函数特征相同,具体的实现内容不同。
- 范围:两个有继承关系的类中,一般是子类重写父类的方法
- 形式:函数名,形参列表,返回值都要相同,必须时候有virtual关键字修饰,不能有static关键字修饰,有static修改的方法是属于类的子类不能重写。
- 重写的访问修饰符可以不同,例如父类的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;
}
- 重定义redefining:
派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。
- 范围:两个有继承关系的类中,一般是子类重定义父类的方法
- 形式:函数的名字必须相同,对函数的返回值、形参列表无要求
- 注意:若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数,这个并不是重定义。
- 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数
- 派生类屏蔽了与其同名的基类函数
- 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏
- 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有关键字,此时,基类的函数被隐藏