gpt4 book ai didi

c++ - 通过引用传递是否总能避免切片问题?

转载 作者:可可西里 更新时间:2023-11-01 18:04:33 28 4
gpt4 key购买 nike

这让我有点吃惊,但我在研究一些代码时发现,至少在我的计算机上,当一个函数通过引用接受父类并且你传递一个子实例时,切片问题不会发生。举例说明:

#include <iostream>

class Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Parent::DoSomething" << endl;
}
};

class Child : public Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Child::DoSomething" << endl;
}
};

void performSomething(Parent& parent)
{
parent.doSomething();
}

int main(int argc, char** argv)
{
Child myChild;

performSomething(myChild);

return 0;
}

这会打印出 Child::DoSomething

就像我说的,我有点惊讶。我的意思是,我知道通过引用传递就像传递指针(但在我的理解中更安全),但我不知道在这样做时我仍然必须保持多态的优点。

我只是想确定,这是否应该发生,或者它是否属于“它在我的机器上工作”类型的实例之一?

最佳答案

“切片”指的是基复制构造函数无法区分派(dispatch)生类的精确类型匹配。调用切片的唯一方法是调用基本复制构造函数。这通常发生在按值传递参数时,但也可以设计其他情况:

class Base { };
class Derived : public Base { };

void foo(Base);

int main()
{
Derived x;

Base y = x; // flagrant slicing
foo(x); // slicing by passing by value
}

你永远不会做任何这样的事情,所以你不会遇到任何切片情况。

关于c++ - 通过引用传递是否总能避免切片问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278714/

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