函数重载:
重载是指相同的函数名,不同的参数列表(与返回值无关)
1、函数的名字必须相同
2、函数的参数列表必须不同,与参数列表的顺序无关
3、返回值类型可以不同
函数重写(覆写)
覆写是指子类的成员函数覆盖了父类的虚函数
1、不同的范围,分别位于基类和派生类中
2、函数名相同
3、参数列表相同
4、返回值相同
5、基类函数必须有virtual关键字
6、只有虚方法或抽象方法才能够被覆写
重定义(隐藏)
函数重定义指的是子类的成员函数屏蔽了与其同名的父类函数
1、如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。否则就是重写。
代码示例:
#include <iostream>
using namespace std;
class Base {
public:
// 普通成员函数
void func() {
cout << "it's Base func()" << endl;
}
// 函数重载 func()
void func(int a) {
cout << "it's Base func(), a = " << a << endl;
}
// 虚函数
virtual void func2() {
cout << "it's Base func2()" << endl;
}
};
class Derived : public Base {
public:
// 覆写父类的虚函数
// 也是对父类的func2()进行重定义,只不过带有virtual关键字
void func2() {
cout << "it's child 2" << endl;
}
// 重定义 : 对于父类的func()
void func(int a) {
cout << "it's child func(), a = " << a << endl;
}
};
int main() {
Base* b; // 父类指针
Derived d; // 子类对象
b = &d;
b->func(); // Base func() 子类继承了父类的public接口,因此可以访问父类接口
b->func(100); // Base func(2) 子类继承了父类的public接口,因此可以访问父类接口
b->func2(); // Derived func2() 多态
d.func(100); // Derived func() 子类对象的接口
d.func2(); // Derived func2() 子类对象的接口
return 0;
}
代码输出:
it's Base func()
it's Base func(), a = 100
it's child 2
it's child func(), a = 100
it's child 2
谢谢阅读