一.final
用法:
1.修飾函數
只能修飾虛函數,阻止子類重寫這個函數,final關鍵字寫在函數名的后面。
即該虛函數不可以再被重寫。
注意:一般不會在基類中使用,不然沒有意義,因為只能修飾虛函數。
2.修飾類
表示該不能被繼承,即無派生類。
使用示例:
#include <iostream>
using namespace std;class Base
{
public:virtual void test(){cout << "base class" <<endl;}
};class Child:public Base
{
public:void test() final //修飾虛函數{cout << "Chile class" <<endl;}
};class GrandChild final : public Child{ //修飾類
public:void test1(){}
};//錯誤,不能被繼承
// class GGChild : public GrandChild
// {// }
二.override
用法:
重寫,確保再派生類中聲明的重寫函數與基類的虛函數有相同的簽名。(防止手誤)
用于多態:
多態特征:
1.有繼承關系
2.重寫父類虛函數
3.父類指針指向子類對象
使用示例:
#include <iostream>
using namespace std;class Base
{
public:virtual void test(){cout << "base class" <<endl;}
};class Child:public Base
{
public:void test() {cout << "Chile class" <<endl;}
};class GrandChild : public Child{
public:void test() override //確保再派生類中聲明的重寫函數與基類的虛函數有相同的簽名。{cout << "GrandChild class" <<endl;}
};int main()
{GrandChild Gd;Base* ptr = new Child();Base* ptr1 = &Gd;ptr->test();ptr1->test();Gd.test();return 0;
}
?
三.重寫override和重載overload的區別
1.作用域不同
重寫發生在不同的類(基類和子類)之間。
重載發生在同一個作用域內。
2.判斷依據不同
重寫依據函數簽名是否相同以及基類函數是否為虛函數。
重載依據參數列表是否不同。
3.目的不同
重寫的目的是實現運行時多態,讓基類指針或引用能夠根據實際指向的對象類型調用相應的函數。
重載的目的是為了方便用戶使用,通過相同的函數名處理不同類型的數據,提高代碼的可讀性和易用性。