焦作网站建设公司哪家好微信端网站设计规范
焦作网站建设公司哪家好,微信端网站设计规范,网站底部友情链接怎么做的,如何用dw做网站前端用QT写一个无界面、新手友好的多态例子#xff0c;并且详细讲解每一步的逻辑#xff0c;彻底理解多态的核心含义和实际用法。先通俗理解多态#xff08;新手版#xff09;多态的核心是#xff1a;同一个接口#xff0c;不同的实现。就像你去餐厅点“饮料”#xff08;统…用QT写一个无界面、新手友好的多态例子并且详细讲解每一步的逻辑彻底理解多态的核心含义和实际用法。先通俗理解多态新手版多态的核心是同一个接口不同的实现。就像你去餐厅点“饮料”统一接口服务员给你可乐/果汁/茶不同实现——你只需要说“要饮料”不用关心具体是哪种每种饮料都有自己的“喝法”不同行为。在QT/C中多态主要通过虚函数实现父类定义虚函数统一接口子类重写这个函数不同实现用父类指针/引用调用时会自动执行子类的实现。例子设计思路无界面贴近通信场景我设计一个极简但完整的多态例子基于你熟悉的“通信”场景父类通信设备基类定义虚函数sendData()统一接口。子类1串口设备重写sendData()实现串口发送逻辑。子类2TCP设备重写sendData()实现TCP发送逻辑。测试逻辑用父类指针指向不同子类对象调用同一个sendData()观察不同的执行结果多态的体现。完整代码实现逐文件讲解1. 通信设备基类commdevice.h—— 定义统一接口这是多态的“核心骨架”用纯虚函数0强制子类实现统一接口保证所有通信设备都有sendData()方法。#ifndef COMMDEVICE_H #define COMMDEVICE_H #include QObject #include QString #include QDebug // 通信设备基类抽象类 class CommDevice : public QObject { Q_OBJECT public: // 构造函数给父类传参 explicit CommDevice(QObject *parent nullptr) : QObject(parent) {} // 虚析构函数必须加保证子类析构时能正确调用自己的析构 virtual ~CommDevice() { qDebug() CommDevice 基类析构; } // 核心虚函数统一接口子类必须重写 // virtual 关键字是多态的关键 virtual bool sendData(const QString data) 0; // 纯虚函数无实现 }; #endif // COMMDEVICE_H2. 串口设备子类serialdevice.h/cpp—— 重写接口继承基类实现串口特有的发送逻辑。serialdevice.h#ifndef SERIALDEVICE_H #define SERIALDEVICE_H #include commdevice.h // 串口设备子类继承通信基类 class SerialDevice : public CommDevice { Q_OBJECT public: explicit SerialDevice(QObject *parent nullptr) : CommDevice(parent) { qDebug() SerialDevice 串口设备创建; } // 重写父类的虚函数必须加 override 关键字新手一定要加防止写错 bool sendData(const QString data) override; // 串口特有配置子类扩展的功能 void setSerialPort(const QString portName) { m_portName portName; } private: QString m_portName; // 串口名子类私有数据 }; #endif // SERIALDEVICE_Hserialdevice.cpp#include serialdevice.h // 实现串口的sendData这是串口特有的发送逻辑 bool SerialDevice::sendData(const QString data) { qDebug() 【串口发送】端口 m_portName 数据 data; // 这里可以加真实的QT串口发送代码新手先简化 return true; // 模拟发送成功 }3. TCP设备子类tcpdevice.h/cpp—— 重写接口继承基类实现TCP特有的发送逻辑。tcpdevice.h#ifndef TCPDEVICE_H #define TCPDEVICE_H #include commdevice.h // TCP设备子类继承通信基类 class TcpDevice : public CommDevice { Q_OBJECT public: explicit TcpDevice(QObject *parent nullptr) : CommDevice(parent) { qDebug() TcpDevice TCP设备创建; } // 重写父类的虚函数 bool sendData(const QString data) override; // TCP特有配置子类扩展的功能 void setTcpAddr(const QString ip, int port) { m_ip ip; m_port port; } private: QString m_ip; // TCP IP子类私有数据 int m_port; // TCP 端口 }; #endif // TCPDEVICE_Htcpdevice.cpp#include tcpdevice.h // 实现TCP的sendData这是TCP特有的发送逻辑 bool TcpDevice::sendData(const QString data) { qDebug() 【TCP发送】IP:Port m_ip : m_port 数据 data; // 这里可以加真实的QT TCP发送代码新手先简化 return true; // 模拟发送成功 }4. 测试主函数main.cpp—— 核心演示多态这是最关键的部分新手重点看这里的多态调用逻辑。#include QCoreApplication #include commdevice.h #include serialdevice.h #include tcpdevice.h // 通用发送函数接收父类指针实现多态调用 // 新手重点这个函数只认父类CommDevice不知道传入的是串口还是TCP void sendDataByDevice(CommDevice *device, const QString data) { device-sendData(data); // 核心调用父类接口实际执行子类实现 } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // -------------------------- // 步骤1创建子类对象 // -------------------------- SerialDevice *serial new SerialDevice; // 串口对象 serial-setSerialPort(COM3); // 串口特有配置 TcpDevice *tcp new TcpDevice; // TCP对象 tcp-setTcpAddr(192.168.1.100, 502); // TCP特有配置 // -------------------------- // 步骤2多态核心操作 // -------------------------- // 父类指针指向串口子类对象 CommDevice *device1 serial; device1-sendData(串口数据123); // 实际执行SerialDevice::sendData // 父类指针指向TCP子类对象 CommDevice *device2 tcp; device2-sendData(TCP数据456); // 实际执行TcpDevice::sendData // -------------------------- // 步骤3更实用的场景通用函数 // -------------------------- // 同一个函数传入不同子类对象执行不同逻辑 sendDataByDevice(serial, 通用函数-串口发送789); sendDataByDevice(tcp, 通用函数-TCP发送000); // -------------------------- // 清理内存新手别漏 // -------------------------- delete serial; delete tcp; return a.exec(); }代码运行结果新手重点看SerialDevice 串口设备创建 TcpDevice TCP设备创建 【串口发送】端口 COM3 数据 串口数据123 【TCP发送】IP:Port 192.168.1.100 : 502 数据 TCP数据456 【串口发送】端口 COM3 数据 通用函数-串口发送789 【TCP发送】IP:Port 192.168.1.100 : 502 数据 通用函数-TCP发送000 CommDevice 基类析构 CommDevice 基类析构逐行讲解多态核心逻辑新手必看父类定义虚函数CommDevice中的virtual bool sendData(...) 0;是“统一接口”告诉所有子类必须实现这个发送方法但怎么实现我不管。子类重写虚函数SerialDevice和TcpDevice都用override重写了sendData分别实现串口/TCP的发送逻辑——这是“不同实现”。父类指针指向子类对象CommDevice *device1 serial;父类指针装了串口对象的地址。device1-sendData(...)编译器不会直接调用父类的方法而是“看指针实际指向的对象”——发现是串口对象就执行串口的sendData。通用函数的妙用sendDataByDevice(CommDevice *device, ...)这个函数只接收父类指针不管传入的是串口还是TCP都能正确调用对应的发送方法——这就是多态的价值写一次代码适配多种场景。新手容易踩的坑重点提醒忘记加 virtual 关键字父类的函数如果不加virtual就不会触发多态调用的永远是父类的方法但本例中父类是纯虚函数会编译报错反而更安全。重写函数时签名不一致比如父类是sendData(const QString )子类写成sendData(QString)——编译器会认为是新函数不是重写一定要加override关键字编译器会帮你检查签名是否一致。漏写虚析构父类析构如果不加virtual删除父类指针时子类的析构不会执行会导致内存泄漏。总结多态的核心QT/C中通过virtual虚函数实现父类定义统一接口子类重写实现不同逻辑父类指针/引用调用时自动匹配子类实现。关键语法父类虚函数virtual 子类重写override 父类指针指向子类对象。实际价值写通用代码比如sendDataByDevice时不用关心具体是哪种设备新增UDP设备只需继承基类重写sendData不用改原有代码符合开闭原则。这个例子是新手能直接跑通的极简版本没有复杂的QT底层通信逻辑所有注意力都集中在多态的核心语法和逻辑上你可以先复制代码跑起来再逐行修改体会多态的效果。