C++11新特性:final/override控制

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 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也采用类似的做法。

C++11新特性:final/override控制_第1张图片

   final通常用在继承关系中中途终止派生类的重载。从接口派生的角度而言,final可以在派生过程中任意阻止一个接口的可重载性。

你可能感兴趣的:(c++,开发语言)