重载:是指在同一个作用域内(比如一个类内部),函数根据参数类型或者参数个数等有关函数参数的差异声明不同函数,不能只根据函数返回值重载函数,如:
class Base {
public:
Base() = default;
~Base() = default;
public:
void function1()
{
printf("this is Base function1
");
}
virtual void function2()
{
printf("this is Base function2
");
}
int function3(int arg1, int arg2)
{
printf("this is Base functio3 %d, %d
", arg1, arg2);
}
int function3(char ch1, char ch2)
{
printf("this is Base functio3 %d, %d
", ch1, ch2);
}
};
function3属于重载函数,虽然有两个function3但是两个函数参数类型不同。
重写:是有关多态的一种类型,子类重写父类的虚函数,如:
class Base {
public:
Base() = default;
~Base() = default;
public:
void function1()
{
printf("this is Base function1
");
}
virtual void function2()
{
printf("this is Base function2
");
}
};
class Child : public Base {
public:
Child() = default;
~Child() = default;
public:
void function1()
{
printf("this is Child function1
");
}
virtual void function2()
{
printf("this is Child function2
");
}
};
Child类的function2重写父类Base的function2.
所以具体区别可以总结为:
(1)范围区别:重载和被重载的函数在同一类中,重写和被重写的函数在不同的类中。
(2)参数区别:重载和被重载的函数参数列表一定不同,重写与被重写的函数参数列表一定相同。
(3)virtual的区别:重载函数和被重载函数可以被virtual修饰,也可以没有,重写的基类必须要有virtual修饰。