重载 | 重写=覆盖 | 重定义=隐藏 |
---|---|---|
即函数重载或运算符重载,需要在同一作用域里,函数名相同,参数类型或者参数个数不同,返回值可同可不同 | 用于多态,函数名和参数都相同,仅仅只有内部实现不同 | 用于继承,基类和派生类中有同名成员,派生类成员将屏蔽基类对同名成员的直接访问,即在基类和派生类中的同名成员 |
重载举个栗子:
#include <iostream>
using namespace std;
class printData
{
public: //这几个print()函数构成重载
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
void print(char c[]) {
cout << "字符串为: " << c << endl;
}
};
int main(void)
{
printData pd;
// 输出整数
pd.print(5);
// 输出浮点数
pd.print(500.263);
// 输出字符串
char c[] = "Hello C++";
pd.print(c);
return 0;
}
重定义=隐藏举个栗子:
// B中的fun和A中的fun不是构成重载,因为不是在同一作用域
// B中的fun和A中的fun构成隐藏,成员函数满足函数名相同就构成隐藏。
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A
{
public:
void fun(int i)
{
A::fun();
cout << "func(int i)->" <<i<<endl;
}
};
void Test()
{
B b;
b.fun(10);//b.A::fun();//可调A的fun()
};
重写=覆盖举个栗子:
class Person {
public:
virtual void BuyTicket() { cout << "买票-全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() { cout << "买票-半价" << endl;
}
};
void Func(Person& p)
{
p.BuyTicket();
}
int main()
{
Person ps;
Student st;
Func(ps);
Func(st);
return 0;
}