重载:
1>作用域相同。
2>函数名相同,参数列表不同。
3>与返回值无关。
例:同一个类的构造函数和拷贝构造函数构成重载。
class A
{
A()
{}
A(const A& a)
{}
};
重写(覆盖):
1>不在同一作用域(分别为基类和派生类)。
2>函数名相同,参数列表相同,返回值相同。
3>基类成员函数必须有virtual关键字修饰。
4>访问修饰符可以不同。
例:
class person
{
public:
virtual void BuyTickets()
{
std::cout << "全价票" << std::endl;
}
};
class student :public person
{
public:
void BuyTickets()
{
std::cout << "半价票" << std::endl;
}
};
我们在用基类的指针或者引用访问student类时,这时候调用的是student类的方法。
int main()
{
person p;
student s;
person* ptr = &s;
ptr->BuyTickets();
person& stu = s;
stu.BuyTickets();
return 0;
}
输出结果,说明person类中的方法已经被重写。
重定义(隐藏):
1>不在同一作用域(分别为基类和派生类)。
2>函数名不同。
3>在基类和派生类中只要不构成重写就是重定义
例:
class A
{
public:
void fun(int a)
{
std::cout << "A" << std::endl;
}
};
class B:public A
{
public:
void fun(double b)
{
std::cout << "B" << std::endl;
}
};
当A类中和B类中拥有相同名称的成员时,B继承A。那么在B类实例化之后想要调用A中相同名称的成员,需要加上作用域解析符。