重載:是指在同一個作用域內(比如一個類內部),函數根據參數類型或者參數個數等有關函數參數的差異聲明不同函數,不能只根據函數返回值重載函數,如:
class Base {
public:
Base() = default;
~Base() = default;
public:
void function1()
{
printf("this is Base function1\n");
}
virtual void function2()
{
printf("this is Base function2\n");
}
int function3(int arg1, int arg2)
{
printf("this is Base functio3 %d, %d\n", arg1, arg2);
}
int function3(char ch1, char ch2)
{
printf("this is Base functio3 %d, %d\n", ch1, ch2);
}
};
function3屬於重載函數,雖然有兩個function3但是兩個函數參數類型不同。
重寫:是有關多態的一種類型,子類重寫父類的虛函數,如:
class Base {
public:
Base() = default;
~Base() = default;
public:
void function1()
{
printf("this is Base function1\n");
}
virtual void function2()
{
printf("this is Base function2\n");
}
};
class Child : public Base {
public:
Child() = default;
~Child() = default;
public:
void function1()
{
printf("this is Child function1\n");
}
virtual void function2()
{
printf("this is Child function2\n");
}
};
Child類的function2重寫父類Base的function2.
所以具體區別可以總結為:
(1)范圍區別:重載和被重載的函數在同一類中,重寫和被重寫的函數在不同的類中。
(2)參數區別:重載和被重載的函數參數列表一定不同,重寫與被重寫的函數參數列表一定相同。
(3)virtual的區別:重載函數和被重載函數可以被virtual修飾,也可以沒有,重寫的基類必須要有virtual修飾。