先说下什么是重载,一个A类中声明的虚函数fun在其子类B中再次被定义,且B中的函数fun跟A中的fun原型一样(函数名、参数列表等一样),那我们就称B重载(override)了A的fun函数。对于任何B类型的变量,调用成员函数fun都是调用了B重载的版本。而如果同时有A的子类C,没有重载fun函数,那么调用C类型的fun都是调用A的fun。
C++中重载还有个特点就是,基类声明为virtual的函数,之后的重载版本都不需要再声明virtual,如上A的fun是virtual的,那A
的子类B的fun也是virtual,假设BB是B的子类,一样可以重载fun,如果B不希望自己的子类重载fun,则可在函数上加上final关键字。如:
class A {
virtual void fun(){
cout << "A" << endl;
}
};
class B:A {
void fun() final {
cout << "B" << endl;
}
};
class BB:B {
void fun() { //编译不过
cout << "B" << endl;
}
};
override关键字则是用来表明该方法是不是某个虚函数的重载,如果子类在函数声明时使用了override描述符,则其基类必须存在同原型的方法,否则编译不过,如:
class A {
virtual void fun(){
cout << "A" << endl;
}
};
class B:A {
void fun() override {
cout << "B" << endl;
}
void fun2() override { //编译不通过,因为基类无此原型的虚函数
cout << "B2" << endl;
}
};