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可以在派生过程中任意阻止一个接口的可重载性。