重载
重载最重要的一点是,两个重载的函数必须在同一作用域内(同一大括号内)
1.只要参数列表不相同就算重载(参数列表中只要变量的个数或者变量的类型不同都算参数列表不同)
2.重载不关心返回值类型是否相同,但是若只有返回值类型不同而参数列表是相同的,则不能叫做重载(编译器也不会允许这样写)
#include <iostream>
#include <vector>
using namespace std;
class Father {
public:
void fun() {
cout << "fun" << endl;
}
void fun(int i) {
cout << i << endl;
}
};
int main(){
Father f;
f.fun();
f.fun(3);
}
重写
重写的是针对于虚函数来说的,并且子类中重写的函数必须与父类中的函数同名,同参数列表,二者缺一不可
即在子类中,将虚函数名与参数列表都相同的函数重写其方法体
并且使用动态多态必须要用到对象指针,不能用对象本身
#include <iostream>
#include <vector>
using namespace std;
class Father {
public:
virtual void fun() {
cout << "I'm Father" << endl;
}
};
class Son :public Father {
public:
//这是 重写
//即在子类中,将虚函数名与参数列表都相同的函数重写其方法体
void fun() {
cout << "I'm Son" << endl;
}
};
int main(){
Father* f = new Father();
f->fun();
f = new Son();
f->fun();
}
面向对象中的多态特性就是由重写和重载所构成的
重载是静态多态,而重写是动态多态
隐藏
隐藏指的是子类中的同名函数屏蔽了父类中的同名函数,根据参数列表是否相同分为两种情况
(1)如果参数列表不同时,则无论有无virtual关键字,都构成隐藏
(注意构成重写的条件:子类中重写父类的虚函数必须同名,同参数列表。当函数名相同但是参数列表不同时,不构成重写,而构成隐藏)
#include <iostream>
#include <vector>
using namespace std;
class Father {
public:
virtual void fun() {
cout << "I'm Father" << endl;
}
};
class Son : public Father {
public:
//子类与父类同名函数的参数列表不同,则不管父类的同名函数是否是虚函数,都构成隐藏
void fun(int i) {
cout << i << endl;
}
};
int main(){
Father f;
f.fun();
Son s;
s.fun(3);
}
(2)如果参数列表相同,则无virtual关键字时也是构成隐藏(如果有virtual关键字并且函数名与参数列表都相同的情况下构成的是重写)
#include <iostream>
#include <vector>
using namespace std;
class Father {
public:
void fun() {
cout << "I'm Father" << endl;
}
};
class Son : public Father {
public:
//子类与父类函数名相同并且参数列表相同,但是父类中的函数不是虚函数,则构成隐藏而不是重写
void fun(int i) {
cout << i << endl;
}
};
int main(){
Father f;
f.fun();
Son s;
s.fun(3);
}