先說(shuō)下什么是重載,一個(gè)A類中聲明的虛函數(shù)fun在其子類B中再次被定義,且B中的函數(shù)fun跟A中的fun原型一樣(函數(shù)名、參數(shù)列表等一樣)俐芯,那我們就稱B重載(override)了A的fun函數(shù)。對(duì)于任何B類型的變量钉鸯,調(diào)用成員函數(shù)fun都是調(diào)用了B重載的版本吧史。而如果同時(shí)有A的子類C,沒(méi)有重載fun函數(shù)唠雕,那么調(diào)用C類型的fun都是調(diào)用A的fun贸营。
C++中重載還有個(gè)特點(diǎn)就是,基類聲明為virtual的函數(shù)及塘,之后的重載版本都不需要再聲明virtual,如上A的fun是virtual的锐极,那A
的子類B的fun也是virtual笙僚,假設(shè)BB是B的子類,一樣可以重載fun灵再,如果B不希望自己的子類重載fun肋层,則可在函數(shù)上加上final關(guān)鍵字亿笤。如:
class A {
virtual void fun(){
cout << "A" << endl;
}
};
class B:A {
void fun() final {
cout << "B" << endl;
}
};
class BB:B {
void fun() { //編譯不過(guò)
cout << "B" << endl;
}
};
override關(guān)鍵字則是用來(lái)表明該方法是不是某個(gè)虛函數(shù)的重載,如果子類在函數(shù)聲明時(shí)使用了override描述符栋猖,則其基類必須存在同原型的方法净薛,否則編譯不過(guò),如:
class A {
virtual void fun(){
cout << "A" << endl;
}
};
class B:A {
void fun() override {
cout << "B" << endl;
}
void fun2() override { //編譯不通過(guò)蒲拉,因?yàn)榛悷o(wú)此原型的虛函數(shù)
cout << "B2" << endl;
}
};