『 C++ 』中不可重写虚函数的实用案例

文章目录


在C++编程里,用final关键字修饰、不允许被继承(重写)的虚函数其实很有用。接下来我就结合实际案例,给大家讲讲它的用途。

框架设计:保障核心逻辑稳定

在设计大型软件框架时,有些虚函数代表着框架的核心逻辑。为了保证框架稳定、不出错,我们不希望这些核心逻辑被派生类修改。就拿图形绘制框架来说吧。

cpp 复制代码
#include <iostream>

// 图形基类
class Shape {
public:
    // 绘制图形的核心逻辑,不允许派生类重写
    virtual void draw() final {
        std::cout << "Base drawing logic..." << std::endl;
        specificDraw();
    }

    // 留给派生类实现的特定绘制逻辑
    virtual void specificDraw() = 0;

    virtual ~Shape() {}
};

// 圆形类
class Circle : public Shape {
public:
    void specificDraw() override {
        std::cout << "Drawing a circle..." << std::endl;
    }
};

// 矩形类
class Rectangle : public Shape {
public:
    void specificDraw() override {
        std::cout << "Drawing a rectangle..." << std::endl;
    }
};

int main() {
    Shape* circle = new Circle();
    circle->draw();

    Shape* rectangle = new Rectangle();
    rectangle->draw();

    delete circle;
    delete rectangle;
    return 0;
}

在这个例子中,Shape类的draw函数是核心绘制逻辑,用final修饰后,派生类就没法重写它。这样能保证绘制图形时,总会先执行基类定义的通用绘制逻辑。而specificDraw是纯虚函数,留给派生类实现特定的绘制逻辑。这就好比盖房子,基类的通用逻辑是房子的框架,必须稳定,而派生类的特定逻辑是房子里的装修,可以根据需求定制。

避免误操作:防止逻辑混乱

在复杂的类继承体系中,派生类可能会意外重写某些关键虚函数,导致逻辑混乱。使用final就能避免这种情况。下面是一个文件操作类的例子。

cpp 复制代码
#include <iostream>

// 文件操作基类
class FileOperator {
public:
    // 打开文件的操作,不允许派生类重写
    virtual void openFile() final {
        std::cout << "Opening file with standard procedure..." << std::endl;
        // 这里可以包含一些固定的文件打开逻辑
        specificOpen();
    }

    // 留给派生类实现的特定打开逻辑
    virtual void specificOpen() = 0;

    virtual ~FileOperator() {}
};

// 文本文件操作类
class TextFileOperator : public FileOperator {
public:
    void specificOpen() override {
        std::cout << "Setting text file encoding..." << std::endl;
    }
};

// 二进制文件操作类
class BinaryFileOperator : public FileOperator {
public:
    void specificOpen() override {
        std::cout << "Checking binary file header..." << std::endl;
    }
};

int main() {
    FileOperator* textFile = new TextFileOperator();
    textFile->openFile();

    FileOperator* binaryFile = new BinaryFileOperator();
    binaryFile->openFile();

    delete textFile;
    delete binaryFile;
    return 0;
}

FileOperator类的openFile函数包含标准的文件打开流程,用final修饰后,能防止派生类意外修改这个关键流程。而specificOpen作为纯虚函数,让不同类型的文件操作类可以实现自己特定的打开逻辑。这就像工厂的生产流程,核心流程不能变,不同产品可以有自己的特殊处理环节。

确保接口一致:库与API设计

在设计库或者API时,为了保证接口一致,有些虚函数的实现需要固定下来。比如网络通信库的基类。

cpp 复制代码
#include <iostream>

// 网络通信基类
class NetworkCommunicator {
public:
    // 建立连接的操作,不允许派生类重写
    virtual void establishConnection() final {
        std::cout << "Establishing network connection with standard protocol..." << std::endl;
        // 可以包含一些固定的连接建立逻辑
        specificConnection();
    }

    // 留给派生类实现的特定连接逻辑
    virtual void specificConnection() = 0;

    virtual ~NetworkCommunicator() {}
};

// TCP通信类
class TCPCommunicator : public NetworkCommunicator {
public:
    void specificConnection() override {
        std::cout << "Configuring TCP parameters..." << std::endl;
    }
};

// UDP通信类
class UDPCommunicator : public NetworkCommunicator {
public:
    void specificConnection() override {
        std::cout << "Setting up UDP socket..." << std::endl;
    }
};

int main() {
    NetworkCommunicator* tcpComm = new TCPCommunicator();
    tcpComm->establishConnection();

    NetworkCommunicator* udpComm = new UDPCommunicator();
    udpComm->establishConnection();

    delete tcpComm;
    delete udpComm;
    return 0;
}

NetworkCommunicator类的establishConnection函数定义了标准的网络连接建立流程,用final保证了所有派生类在建立连接时遵循相同的基本步骤。specificConnection作为纯虚函数,让不同的通信协议类可以实现自己特定的连接逻辑。这就像不同的交通工具都要遵循交通规则出发,但每种交通工具又有自己的驾驶方式。

总的来说,不被继承的虚函数在保证核心逻辑稳定、避免误操作以及确保接口一致等方面都有重要作用,是C++编程中一个实用的特性。

相关推荐
乐观勇敢坚强的老彭28 分钟前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
离陌在学C#42 分钟前
C# 泛型:从基础到高级应用
开发语言·c#
ly768942 分钟前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
SomeB1oody1 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
我变成萤火虫1 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
萧瑟余晖1 小时前
Java深入解析篇三十之Java日志框架
java·开发语言
Herbert_hwt1 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
buhuizhiyuci1 小时前
【Linux 篇】数字世界的水流蓄水池 —— IO 缓冲区机制深度实战解析
linux·运维·服务器·c++
AI视觉网奇1 小时前
动作识别 视频理解大模型
开发语言·python·音视频
啦啦啦啦啦zzzz2 小时前
moduo网络库 Acceptor TcpConnection
服务器·网络·c++·reactor·网络库