重载:
在同一作用域下, 函数名相同, 但是参数列表不同。
重写:
分别在基类和派生类中(在不同作用域下), 函数名相同,参数相同, 返回类型相同, 并且基类函数必须为虚函数。
重定义:
分别在基类和派生类中(在不同作用域下), 函数名相同,不构成重写的话则为重定义(参数列表可相同可不同)。
#include<iostream>
using namespace std;
class Base
{
public:
virtual void print()
{
cout << "调用基类的print方法" << endl;
}
void print(int i) //函数重载:作用域相同,但参数列表不同
{
cout << "i: " << i << endl;
}
};
class Derived : public Base
{
public:
virtual void print() //不加virtual关键字的话,为重定义。加virtual关键字的话,为重写
{
cout << "调用派生类的print方法" << endl;
}
void print(int i) //对于基类中的函数,为重定义。对于派生中的print函数而言,为函数重载
{
cout << "i: " << i + 1 << endl;
}
};
int main()
{
Base b1;
b1.print();
b1.print(2);
Derived d1;
d1.print();
//调用的派生类的print(int i)
d1.print(3);
//调用的基类的print(int i)
d1.Base::print(3);
//多态,根据指向的对象的类型进行调用
Base *pb = &b1;
pb->print();
pb = &d1;
pb->print();
return 0;
}