首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么调用基类的赋值运算符?

为什么调用基类的赋值运算符?
EN

Stack Overflow用户
提问于 2020-08-02 05:34:44
回答 1查看 50关注 0票数 2

在下面的代码中,我了解到结构d中的赋值操作符不是在derived1 = derived2;上调用的,而是生成和调用默认赋值运算符。然而,我不明白为何:

为什么在derived1 = derived2;中隐式向上转换时不调用显式d赋值运算符?

--我猜是--默认的operator= (带有标头void operator=(const derived& d))总是生成的,除非使用完全相同的标头显式重载,并且总是匹配由相同类型的两个变量组成的赋值。我在正确的道路上吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct b {
   int x;
   void operator=(const b& base) {
      std::cout << "base" << std::endl;
   }
}

struct d: b {
   int y;
   void operator=(const b& base) {
      std::cout << "derived" << std::endl;
   }
}

int main() {
   b base1;
   d derived1;
   d derived2;
   b & base2 = derived1;

   derived1 = base1; // output: "derived"
   derived1 = derived2; // output "base"
}
EN

回答 1

Stack Overflow用户

发布于 2020-08-02 05:38:29

你的猜测基本上是正确的。编译器将合成一个定义为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void operator=(const d&)

对于派生类d。(除非它没有被合成,因为它是显式的deleted,或者某些特殊的成员函数是用户定义的)。

这个默认的operator=具有这样的行为:它将对参数执行一个成员级的副本,并调用其基类的operator=。在本例中,该操作符打印"base",这就是您所看到的输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63216626

复制
相关文章
C++类的复制构造函数和赋值运算符
前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一、在C++编程中如果没有编写下列成员函数,系统会自动的提供:     (1)构造函数     (2)析构函数     (3)地址运算符     (4)赋值构造函数     (5)赋值运算符     其中(1)-(3)在编程中不会产生什么影响,但是(4)(5)会造成较大的影响 二、赋值构造函数 1、函数原型  Class_na
用户1215536
2018/02/05
1.2K0
C++类的复制构造函数和赋值运算符
MVC的基类
设计一个验证用户身份是否登陆的基类BaseController /// <summary> /// 所有需要进行登录控制的控制器基类 /// </summary> public class BaseController : Controller { /// <summary> /// 当前登录的用户属性 /// </summary> public UserInfo CurrentUserInfo { get;
欢醉
2018/01/22
7840
子类赋值父类的赋值兼容
C++ 中,类型的匹配检测是非常严格的,但是你会发现一个现象,如果一个类继承了另外一个类,把子类的对象赋值给父类的时候,系统不但不提示错误,而且程序还能顺利的编译通过并运行。这其实就是 C++ 内部提供的赋值兼容的过程,但是要注意,如果子类数据成员比父类多,则会出现数据截断。具体表现形式如下图:
我与梦想有个约会
2023/10/20
2010
子类赋值父类的赋值兼容
Python赋值运算符
#!/usr/bin/python # -*- coding: UTF-8 -*- a = 21 b = 10 c = 0 c = a + b print "1 - c 的值为:", c c += a print "2 - c 的值为:", c c *= a print "3 - c 的值为:", c c /= a print "4 - c 的值为:", c c = 2 c %= a print "5 - c 的值为:", c c **= a print "6 - c 的值为:", c c //= a print "7 - c 的值为:", c
用户8442333
2021/05/26
4860
python赋值运算符
---title: python赋值运算符tags: 笔记categories: 笔记author: 喵雨date: 2022-06-23 10:56:19coverImg:---赋值运算符'''赋值运算符=+=-=*=/=//=**='''a = 8c = a + 1print(a, c)a += 1 # a = a+1c = a + 1print(a, c)'''说明一下,上面先是给a赋值为8,c赋值为a+1,输出a,c,得到得结果为8,9接下来用 a+=1,意思就是a = a+1,那么此时a=9,再
meowrain
2022/06/23
5580
python赋值运算符
赋值运算符(应用)
int 1 = 10; i++; //单独使用 System.out.println("i:" + i); // i:11 int j = 10; ++j ; //单独使用 System.out.println("j:" + j); // j:11 int x = 10; int y = x++; //赋值运算,++在后边,所以是使用x原来的值赋值给y , x本身自增丄 System.out.println("x:" + x + ", y:" + y); // x:11, y: 10 i nt m = 10; int n = ++m; //赋值运算,++在前边,所以是使用m自增后的值赋值给n , m本身自增1 System.out.println("m:" + m + ", m:" + m); // m:11 , m: 11 练习: int x = 10; int y = x++ + x++ + x++; System.out.println(y) ; // y的值是多少? /* 解析,三个表达式都是++在后,所以每次使用的都是自增前的值,但程序自左至右执行,所以第一次自增时,使用的是 10进行计算,但第二次自增时,x的值已经自增到11 了,所以第二次使用的是11,然后再次自增… 所以整个式子应该是:int y = 10 + 11 + 12; 输出结果为3 3。 */ 注意:通过此处联系深刻理解自增和自减的规律,但实际开发中强烈建议不要这样写代码!容易挨打!
用户8639654
2021/07/15
4880
Python - 赋值运算符
https://www.cnblogs.com/poloyy/p/15042257.html
小菠萝测试笔记
2021/08/06
7340
赋值运算符重载
当加入了左移重载函数后,在输出cout<<时就已经调用了w的析构函数释放了内存,所以在cout<<w<<endl;会发生错误
大忽悠爱学习
2021/02/22
4380
Java的赋值运算符(一)
其中,variable表示变量名,value表示要赋给变量的值。以下是基本赋值运算符的示例:
玖叁叁
2023/05/06
4830
Java的赋值运算符(二)
其他赋值运算符 除了基本赋值运算符、算术赋值运算符和位运算赋值运算符外,Java还提供了其他赋值运算符。这些赋值运算符包括条件赋值运算符(?:=)和空合并赋值运算符(??=)。以下是这些赋值运算符的详
玖叁叁
2023/05/06
2410
Go-运算符-赋值运算符
Go 中的赋值运算符用于给变量赋值,例如 = 运算符用于将一个表达式的值赋给一个变量。此外,Go 还提供了多种复合赋值运算符,例如 +=、-=、*= 等。本文将介绍 Go 中的赋值运算符及其使用方法。
堕落飞鸟
2023/04/20
5150
基类View
在 Class-based views 源码解析 #1 中我们从宏观层面讨论了 Django 类视图的类继承结构以及命名规律。接下来我们要深入各个具体的类视图,探索其具体的代码实现。本节将分析 base.py 中最重要的的一个类,它也是所有类视图的基类 View 。 之前我们说过,尽管类视图看上去类的种类繁多,但每个类都是各司其职的,且从类的命名就可以很容易地看出这个类的功能。大致可分为如下三个大的功能块,分别由三个类提供对应的方法: 处理 HTTP 请求。根据 HTTP 请求方法的不同做出相应处理。例如同
追梦人物
2018/04/17
9120
JavaScript 算术运算符、赋值运算符
1、算术运算符: +(加)、 -(减)、 *(乘)、 /(除)、 %(求余) 2、赋值运算符:=、 +=、 -=、 *=、 /=、 %= 3、条件运算符:==、===、>、>=、<、<=、!=、&&(而且)、||(或者)、!(否)
Devops海洋的渔夫
2019/05/31
1.2K0
python的抽象基类
与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型)
哒呵呵
2018/08/06
8980
赋值运算符函数__from <剑指Offer>
        前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备。在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题。         题目来源于《剑指Offer》,自己在原有基础上稍作批注和修改。         问题:为类型添加赋值运算符函数,可以把CMyString实例赋值给另一个实例、自身和连续赋值。         学习点:考虑问题充分,自己不会把赋值情况、内存泄漏考虑到这么细致。 #include<cstring> #i
waylon
2018/03/08
6680
【Python】运算符 ( 算术运算符 | 赋值运算符 )
文章目录 一、Python 运算符 1、算术运算符 2、赋值运算符 一、Python 运算符 ---- 1、算术运算符 算术运算符 : 加 : + 减 : - 乘 : * 除 : / 取整除 : // , 该运算只返回商的整数部分 ; 取余 : % 指数 : ** , a**b 的含义是 a 的 b 次方 , 2 ** 3 = 8 代码示例 : 加法运算 : print("1 + 2 = ", 1 + 2) 减法运算 : print("1 - 2 = ", 1 - 2) 乘法运算 : print("1 *
韩曙亮
2023/04/07
8330
【Python】运算符 ( 算术运算符 | 赋值运算符 )
C++核心准则C.87:小心基类的相等运算符
It is really hard to write a foolproof and useful == for a hierarchy.
面向对象思考
2020/03/25
3930
【说站】python赋值运算符支持哪些赋值
1、赋值运算符支持链式赋值。如果想让多个变量同时引用同一个对象,可以使用链式赋值。
很酷的站长
2022/11/23
6070
【说站】python赋值运算符支持哪些赋值
Java之赋值运算符
文章目录 赋值运算符 1. 介绍 2. 赋值运算符的分类 3. 案例演示 4. 赋值运算符特点 赋值运算符 1. 介绍 赋值运算符就是将某个运算后的值,赋给指定的变量。 2. 赋值运算符的分类 基本赋值运算符 = ,int a = 10; 复合赋值运算符 += ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理 a += b; [等价 a = a + b; ] a -= b; [等价 a = a - b; ] 3. 案例演示 案例演示赋值运算符的基本使用。AssignO
兮动人
2021/06/11
6830
Java之赋值运算符
Python基础 - 赋值运算符
似小陈吖
2023/10/17
1630

相似问题

为什么不从基类赋值操作符中调用默认赋值运算符?

17

如何从基类调用派生赋值运算符?

13

基类中的重载赋值运算符

154

派生类继承基类赋值运算符?

51

具有继承和虚拟基类的赋值运算符

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文