浅谈C++虚重载操作符 virtual operator= 的使用方法

发布时间 - 2026-01-10 22:22:18    点击率:

C++中虚操作符和其他虚函数的规则一样,操作符可以为虚函数,进行动态绑定, 虽然这种情况并不多见。本文以赋值操作符operator=举例。

派生类中要重定义基类虚函数,要注意参数必须为基类引用类型,否则与基类中虚函数是完全不同的,无法进行预期的动态绑定。

派生类除了重定义基类的虚操作符,还要定义自身的操作符重载。即派生层次每增加一层,理论上派生类就需要多定义一个操作符重载。

以下程序使用引用reference,通过指针调用赋值操作符(例:*p = value)情况是一样的。

#include <iostream> 
using namespace std; 
               
class Base 
{ 
public: 
  virtual Base& operator=(const Base& rhs) //重载操作符可设为virtual 
  { 
    cout << "Base" << endl; 
    return *this; 
  } 
}; 
               
class Derived : public Base 
{ 
public: 
  //与基类的operator=完全不同,不是重新定义,不会动态绑定。 
  //如果不定义该操作符,会自动合成一个,并自动调用基类的operator=,不会动态绑定 
  Derived& operator=(const Derived& rhs)  
  { 
    cout << "Derived_D" << endl; 
    return *this; 
  } 
               
  //重新定义基类的operator=,会动态绑定 
  //virtual Base& operator=(const Base& rhs) //返回值两种都可以 
  virtual Derived& operator=(const Base& rhs)  
  { 
    cout << "Derived_B" << endl; 
    return *this; 
  } 
}; 
               
class Derived2 : public Derived 
{ 
  //此类需要3个operator= 
  //可定义private的copy函数,由3个operator=调用 
  //可使用dynamic_cast将基类引用参数转为子类,并捕获异常。 
  //如果未发生异常,则调用copy,发生异常则不需赋值 
}; 
               
int main() 
{ 
  Base b1, b2; 
  Derived d1, d2; 
               
  Derived &rd = d1; 
               
  Base &rb1 = b1; //动态类型为Base 
  Base &rb2 = d2; //动态类型为Derived 
                 
  rb1 = d1; //输出"Base" 
  rb2 = d2; //输出"Derived_B" 
               
  rb1 = rb2; //输出"Base" 
  rb2 = rb1; //输出"Derived_B" 
               
  rd = d1; //输出"Derived_D" 
  rd = b1; //输出"Derived_B" 
                 
  getchar(); 
  return 0; 
}

以上就是小编为大家带来的浅谈C++虚重载操作符 virtual operator= 的使用方法全部内容了,希望大家多多支持~


# operator  # 操作符  # 等于  # C++超详细讲解数组操作符的重载  # 详解C++赋值操作符重载  # C++-操作符重载、并实现复数类详解  # C++ 开发之实现操作符重载的实例  # C++ 基础编程之十进制转换为任意进制及操作符重载  # C++中的三大函数和操作符重载(Boolan)  # C++中的操作符重载详细解析  # C++输入输出操作符重载的深入分析  # C++超详细讲解操作符的重载  # 绑定  # 派生类  # 子类  # 两种  # 设为  # 要注意  # 此类  # 这种情况  # 不需  # 浅谈  # 理论上  # 小编  # 中要  # 大家多多  # 返回值  # 类中  # 多见  # 是一样的  # amp  # iostream 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Laravel怎么调用外部API_Laravel Http Client客户端使用  Angular 表单中正确绑定输入值以确保提交与验证正常工作  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何在 React 中条件性地遍历数组并渲染元素  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  深圳网站制作培训,深圳哪些招聘网站比较好?  高防服务器租用指南:配置选择与快速部署攻略  进行网站优化必须要坚持的四大原则  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何做网站制作流程,*游戏网站怎么搭建?  JS弹性运动实现方法分析  北京专业网站制作设计师招聘,北京白云观官方网站?  如何撰写建站申请书?关键要点有哪些?  JavaScript Ajax实现异步通信  详解Android图表 MPAndroidChart折线图  Laravel Docker环境搭建教程_Laravel Sail使用指南  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何安全更换建站之星模板并保留数据?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何用PHP快速搭建CMS系统?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Firefox Developer Edition开发者版本入口  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  js实现点击每个li节点,都弹出其文本值及修改  手机软键盘弹出时影响布局的解决方法  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  教你用AI润色文章,让你的文字表达更专业  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Python3.6正式版新特性预览  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel如何配置任务调度?(Cron Job示例)  使用spring连接及操作mongodb3.0实例  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何用美橙互联一键搭建多站合一网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  HTML 中动态设置元素 name 属性的正确语法详解