gpt4 book ai didi

c++ - 在不处理指针时调用子类(虚拟)函数(后期绑定(bind))

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

查看答案Why do we need virtual functions in C++ ,它们表明虚函数允许后期绑定(bind),这导致在向下转换时能够调用子类函数。

为了完整起见,我包含了相关代码。

class Animal
{
public:
virtual void eat() {
std::cout << "I'm eating generic food.";
}
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
};

现在考虑以下两个函数

void func(Animal *xyz) { xyz->eat(); }
void func2(Animal xyz) { xyz.eat(); }

我们看到调用 func 的结果是

Animal *animal = new Animal;
Cat *cat = new Cat;
func(animal); // outputs: "I'm eating generic food."
func(cat); // outputs: "I'm eating a rat."

当调用 func2 结果时

Animal animal;
Cat cat;
func2(animal); // outputs: "I'm eating generic food."
func2(cat); // outputs: "I'm eating generic food."

我的问题是:

我怎样才能使接收子类实例的非指针参数的函数使用覆盖的方法?换句话说,func2怎么会导致“我在吃老鼠”。此外,我想了解为什么会出现这种差异。提前谢谢你。

最佳答案

How can I make it so, that functions receiving arguments, that are not pointers, to instances of subclasses, will use the overriden methods? In other words, how can func2 result in "I'm eating a rat.".

您可以使用引用而不是指针。

void func2(Animal& xyz) { xyz.eat(); }

然后,使用

Animal animal;
Cat cat;
func2(animal);
func2(cat);

将如您所愿地工作。

Further, I would like to understand why this difference arises.

那是对象切片造成的。参见 What is object slicing?了解什么是对象切片以及它如何在您的代码中发挥作用。

关于c++ - 在不处理指针时调用子类(虚拟)函数(后期绑定(bind)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46461023/

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