gpt4 book ai didi

c++ - 当我收到 `slicing` 的案例时?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:22 24 4
gpt4 key购买 nike

让我们看下一段代码(例如):

class A {
int n;
public:
int f() const { return n; }
void set(int i) { n = i; }
};
class B : public A {
public:
int g() const { return f()+1; }
};
void h(const A& a) {
a.f();
}
int main() {
B b;
A& a = b;
A* ptrA = new B;
h(b);
delete ptrA;
return 0;
}

现在,让我们看看这些行代码:

A& a = b; // Is there "slicing"? (why?)
A* ptrA = new B; // Is there "slicing"? (why?)
A a = b; // Is there "slicing"? (why?)

我真的不明白什么时候我想使用它们中的任何一个,或者什么时候不允许您使用它们中的任何一个。这些行之间真正的区别是什么..

最佳答案

切片是指将派生对象分配给基础实例。例如:

B b;
A a = b;

这里的问题是被调用的 A 的复制构造函数只能看到 BA 部分,因此只会收到。如果您的派生类添加了额外的数据或覆盖了 A 的行为,这就是一个问题。

当您将对象分配给引用或指针时,没有切片。所以

A &a = b;

没问题,就这样:

A *a = &b;

关于c++ - 当我收到 `slicing` 的案例时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com