gpt4 book ai didi

c++ - 将子类传递给采用其父类(super class)的函数

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

假设我有三个类 - AnimalCatDog,其中 Cat DogAnimal 的子类(这听起来确实像第一个类,但我保证这不是作业,只是简化了真正的代码)

Dog* spike = new Dog(); 
Cat* puss = new Cat();

int main(int argc, char** argv)
{
function(spike, puss);
return 0;
}

void function(Animal *pet, Animal *pet2)
{
magic->andSoForth();
}

现在这会产生以下错误:

Cannot convert parameter 1 from 'Dog *' to 'Animal'
No constructor could take the source type,
or constructor overload resolution was ambiguous

将参数更改为完全匹配会产生类似的错误,只是它说它不能从一个类转换到同一个类。

我已经成功地调用了子类的函数和它们从父类(super class)继承的成员,所以我知道这在逻辑上应该可行。我只是不知道这种语言要我以何种扭曲的方式扭曲逻辑。

编辑

解决方案恰好是:指针让每个人都感到困惑。

  • 声明指针。
  • 将指针作为参数发送给不处理指针的函数。

在我的示例中,我将“非指针”发送到需要指针的函数,我只是将其切换。现在它工作正常。

最佳答案

当您动态分配一个新对象时,您会得到一个指向该对象的指针。所以你需要像这样将它存储在一个指针中:

Dog* spike = new Dog();
Cat* puss = new Cat();

然后,您可以为 Animal* 类型的任何参数传递 spikepuss,假设 DogCat 确实继承自 Animal。这是 C++ 中多态性的基础知识:

A prvalue of type “pointer to cv D”, where D is a class type, can be converted to a prvalue of type “pointer to cv B”, where B is a base class (Clause 10) of D.

当然,您可以立即将它们存储为 Animal*:

Animal* spike = new Dog();
Animal* puss = new Cat();

不要忘记删除它们。更好的是,根本不要使用 new:

Dog spike;
Cat puss;
void function(const Animal&, const Animal&);
function(spike, puss);

关于c++ - 将子类传递给采用其父类(super class)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13673020/

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