gpt4 book ai didi

c++ - 为什么我不能用普通变量做多态?

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

我是一名 Java 程序员,最近开始学习 C++。我对某事感到困惑。

我知道在 C++ 中,要实现多态行为,您必须使用指针或引用。例如,考虑一个类 Shape,它具有一个已实现的方法 getArea()。它有几个子类,每个子类都以不同的方式覆盖 getArea() 。考虑以下功能:

void printArea(Shape* shape){
cout << shape->getArea();
}

该函数根据指针指向的具体 Shape 调用正确的 getArea() 实现。

这是一样的:

void printArea(Shape& shape){
cout << shape.getArea();
}

但是,下面的方法不能多态地工作:

void printArea(Shape shape){
cout << shape.getArea();
}

无论在函数中传递哪种具体的 Shape,都会调用相同的 getArea() 实现:Shape< 中的默认实现.

我想了解这背后的技术推理。为什么多态性适用于指针和引用,但不适用于普通变量? (我想这不仅适用于函数参数,而且适用于任何事物)。

请解释此行为的技术原因,以帮助我理解。

最佳答案

答案是复制语义。

当您在 C++ 中按值传递对象时,例如printArea(Shape shape) 对您传递的对象进行复制。如果将派生类传递给此函数,则复制的只是基类 Shape。仔细想想,编译器不可能做任何其他事情。

Shape shapeCopy = circle;

shapeCopy 被声明为 Shape,而不是 Circle,因此编译器所能做的就是构造 的拷贝对象的形状部分。

关于c++ - 为什么我不能用普通变量做多态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188221/

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