gpt4 book ai didi

c++ - 通过引用传递避免对象切片

转载 作者:太空狗 更新时间:2023-10-29 20:03:29 25 4
gpt4 key购买 nike

class Pet {
public:
virtual string getDescription() const {
return "This is Pet class";
}
};

class Dog : public Pet {
public:
virtual string getDescription() const {
return "This is Dog class";
}
};

假设我有一个函数接受 bas 类类型的参数,比如

void describe(Base obj) {
p.getDescription();
}

我在这个函数中传递了派生类对象,所以对象将被切片,我们将得到与基类相关的输出。

但是如果我修改这个函数,让它变成这样

void describe(Base& obj) {
p.getDescription();
}

再次传递派生类对象,这次输出的是派生类。

我不明白按引用传递如何避免对象切片。

最佳答案

派生对象在用于实例化基类对象时会被“切片”。当您按值传递时会发生这种情况,因为函数参数是基类对象,而不是其他任何对象。这相当于这样做:

Derived d;
Base b = d; // b is a Base, not a Derived. It knows nothing of Derived.

引用只是对象的别名,因此对Base 对象的引用不涉及构造新的Base 对象。它只是给一个别名:

Base& b = d; // b aliases d, i.e. a Derived object

在上面的语句之后,bd的别名,可以用来访问dBase 多态接口(interface)。它可以为 Derived 对象起别名,因为 Derived is-a Base。这在私有(private)继承中是不可能的。

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

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