在这种情况下会有对象切片吗?

Posted

技术标签:

【中文标题】在这种情况下会有对象切片吗?【英文标题】:Will there be object slicing in this case? 【发布时间】:2018-03-15 11:39:58 【问题描述】:

给定下一个代码:

class A 
      // ...
;

class B : public A 
      // ...
;

还有:

A a;   
B b;    
A& ab = b;   
ab = a; 

会在这段代码的最后一行进行切片吗?为什么?

【问题讨论】:

奸诈案 @SmitYcyken 你是什么意思? 【参考方案1】:

不会有切片。但是由于引用ab的静态类型,会调用类A的复制赋值运算符。

考虑以下程序

#include <iostream>

struct A 

    A & operator =( const A & )
    
        std::cout << "A::operator = is called" << std::endl;
        return *this;    
    
;

struct B : A 

    B & operator =( const B & )
    
        std::cout << "B::operator = is called" << std::endl;
        return *this;
    
;

int main() 

    A a;   
    B b;    
    A &ab = b;   
    ab = a; 

    return 0;

它的输出是

A::operator = is called

您不能以引用另一个对象的方式重新分配引用。

【讨论】:

@DevSolar 问题不在于切片是什么。问题是在这个例子中是否会有切片。 @VladfromMoscow 在B 中声明的所有b 成员将复制到ab? @StackUser 不会有任何副本。 ab 是对 b 的引用。没有创建任何新对象。 @VladfromMoscow,您复制了一个已经存在的答案。 5 岁的答案:因此,a_ref = b1 行将调用 A 的赋值运算符,而不是 B 的赋值运算符。而你的:由于引用 ab 的静态类型,将调用类 A 的复制赋值运算符。 @SmitYcyken 五年前我不在 SO。:) 我是初学者。

以上是关于在这种情况下会有对象切片吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle在哪些情况下会自动创建索引?

为啥 memset 在这种情况下会失败?

为啥在这种情况下会生成不同的 go-assembler 代码?

网页视频经过m3u8 技术切片且加密的TS文件在播放时有缓存文件,但提取出来就无法播放了,这种情况

SQL 函数在某些情况下会出错,为啥?

@transactional注解在什么情况下会失效