【问题标题】: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 你是什么意思?

标签: c++ class reference


【解决方案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。:) 我是初学者。
猜你喜欢
  • 2012-11-05
  • 2023-01-31
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多