override关键字
用于显式标识一个成员函数(通常是虚函数)是在派生类中重写(覆盖)了基类中的虚函数。这有助于提高代码的可读性,同时在编译时提供了检查,确保派生类中的函数确实是在基类中有对应的虚函数。
当在基类和派生类中使用函数重载(override)时,通过虚函数机制可以实现运行时多态性。
class Shape {
public:virtual void draw() {std::cout << "Drawing a shape." << std::endl;}
};class Circle : public Shape {
public:void draw() override {std::cout << "Drawing a circle." << std::endl;}
};class Square : public Shape {
public:void draw() override {std::cout << "Drawing a square." << std::endl;}
};
int main() {// 使用基类指针实现多态Shape* shapePtr;Circle circle;Square square;// 指针指向 Circle 对象,调用 Circle::draw()shapePtr = &circle;shapePtr->draw();// 指针指向 Square 对象,调用 Square::draw()shapePtr = □shapePtr->draw();// 使用基类引用实现多态Shape& shapeRef = circle;shapeRef.draw(); // 调用 Circle::draw()shapeRef = square;shapeRef.draw(); // 调用 Square::draw()// 使用容器存储不同类型的对象,实现多态std::vector<Shape*> shapes;shapes.push_back(new Circle());shapes.push_back(new Square());for (Shape* shape : shapes) {shape->draw();}// 注意:需要手动释放通过 new 创建的对象for (Shape* shape : shapes) {delete shape;}return 0;
}
C++98中,一旦在基类A中的成员函数fun被声明为virtual,对于派生类B而言,fun总是能被重载。
在java中可以使用final关键字使派生类不可以覆盖它修饰的虚函数。C++11也采用类似的做法。
final通常用在继承关系中中途终止派生类的重载。从接口派生的角度而言,final可以在派生过程中任意阻止一个接口的可重载性。