【C++】面向对象类成员函数的重载、覆盖与隐藏

来源:互联网 发布:手机去热软件 编辑:程序博客网 时间:2024/05/21 12:51

重载:

重载就是一个相同的作用域内实现相同的操作,但是操作的对象不相同

特征:

(1)成员函数重载:
(2)相同的范围(相同的作用域)
(3)函数名字相同
(4)参数不同(类型不同,个数不同,顺序不同)
注意:返回值类型不同不算函数重载


下面给出代码示例

#include <iostream>using namespace std;class father{public:void Add_int(int a, int b);void Add_double(double a, double b);void Add(int a);};void father::Add_int(int a, int b){cout << "Add_int(int a, int b)" << endl;}void father::Add_double(double a, double b){cout << "Add_double(int a, int b)" << endl;}void father::Add(int a){cout << "Add(int a, int b)" << endl;}int main(){father f;f.Add(1);f.Add_double(1.0, 1.0);f.Add_int(1, 2);return 0;}

运行结果



覆盖:

覆盖就是面向对象的多态,指的是派生类函数覆盖基类函数。

特征:

(1)不同的范围(不同的作用域,分别是基类和派生类)

(2)参数相同

(3)函数名字必须相同
(4)函数原型相同

(5)基类函数必须有virtual关键字


下面给出代码示例

#include <iostream>using namespace std;class father{public:virtual void Add_int(int a);void Add_double(double a);};void father::Add_int(int a){cout << "father:Add_int(int a)" << endl;}void father::Add_double(double a){cout << "father:Add_int(int a)" << endl;}class son :public father{public:void Add_int(int a);};void son::Add_int(int a){cout << "son:Add_int(int a)" << endl;}int main(){son s;father *f = &s;f->Add_int(1);s.Add_int(1);s.Add_double(1);return 0;}

运行结果




隐藏:

隐藏就是派生类函数屏蔽了它的基类的同名函数

特征:

(1)不同的范围(不同的作用域,分别是基类和派生类)

(2)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(3)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)这时添加virtual将隐藏换成覆盖

下面给出代码示例

#include <iostream>using namespace std;class father{public:void Add_int(int a);virtual void virtual_Add_int(int a);//基类有virtual关键字void Add_double(double a);virtual void Add_double(double a, double b);};void father::Add_int(int a){cout << "father:Add_int(int a)" << endl;}void father::virtual_Add_int(int a){cout << "father:virtual_Add_int(int a)" << endl;}void father::Add_double(double a){cout << "father:Add_double(double a)" << endl;}void father::Add_double(double a, double b){cout << "father:Add_double(double a, double b)" << endl;}class son :public father{public:void Add_int(int a,int b); // 与基类的函数同名,参数不同void virtual_Add_int(int a, int b);//有virtual与基类的函数同名,参数不同void Add_double(double a);//与基类的函数同名,参数也相同,基类函数没有virtual关键字。void Add_double(double a, double b);};void son::Add_int(int a, int b){cout << "son:Add_int(int a, int b)" << endl;}void son::virtual_Add_int(int a, int b){cout << "son:virtual_Add_int(int a, int b)" << endl;}void son::Add_double(double a){cout << "son:Add_double(double a)" << endl;}void son::Add_double(double a, double b){cout << "son:Add_double(double a, double b)" << endl;}int main(){son s;s.Add_int(1, 2);//s.Add_int(1);显示调用参数少s.virtual_Add_int(1, 2);//s.virtual_Add_int(1);显示调用参数少s.Add_double(1.0);s.Add_double(1.0, 2.0);return 0;}

运行结果



0 0
原创粉丝点击