gpt4 book ai didi

c++ - 为什么在 C++ 中将派生类对象传递给具有基类参数的函数时应该传递引用而不是值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:45 25 4
gpt4 key购买 nike

如果我没记错的话,在 Java 中,我们可以将子类传递给具有父类(super class)的函数。代码如下所示。

// Assume the classes were already defined, and Apple
// and Pineapple are derived from Fruit.
Fruit apple = new Apple();
Fruit pineapple = new Pineapple();

public void iHaveAPenIHaveAn(Fruit fruit) { ... } // :)
...
public static void main(String[] arg)
{
iHaveAPenIHaveAn(apple); // Uh! Apple-pen.
iHaveAPenIHaveAn(pineapple); // Uh! Pineapple-pen.
}

但是,在 C++ 中,我注意到 here您需要使用基类的引用变量(这是正确的术语吗?)而不是基类的常规变量。

假设您有两个类:基类 AA 派生类 B

class A { ... };
class B : A { ... };

如果我们有一个 neverGonna() 函数接受一个类 A 参数,那么为什么这个函数应该是这样的:

void neverGonna(A& a) { ... }
...
B giveYouUp;
neverGonna(giveYouUp);

而不是这个?

void neverGonna(A a) { ... }
...
B letYouDown;
neverGonna(letYouDown);

背后的原因是什么?

最佳答案

Java 中的对象由指针引用。 (Java 称它们为“引用”。)如果你写 Apple a;在 Java 中,变量 a实际上是一个指针,指向一个Apple内存中某处的对象。但是在 C++ 中,如果你写 Apple a;然后是变量 a包含整个 Apple目的。要获得指针,您需要显式声明 a成为指针变量,如 Apple* a; ,或引用,如 Apple& a; .

函数参数也是如此。在 Java 中,如果您发送 Apple到一个需要 Fruit 的方法(假设 AppleFruit 的子类),实际发送的是一个指针,对象本身存储在别处。

在 C++ 中,对象本身被复制,并发送给函数。但是,如果函数需要 Fruit对象,然后您发送 Apple带有一些额外成员变量的对象,Apple将不适合函数必须接收 Fruit 的空间. Apple对象必须转换为 Fruit对象,并删除任何特定于苹果的额外内容。这叫做 object slicing .

关于c++ - 为什么在 C++ 中将派生类对象传递给具有基类参数的函数时应该传递引用而不是值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41595001/

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