【发布时间】:2012-12-02 19:41:16
【问题描述】:
假设我有三个课程 - Animal、Cat 和 Dog,其中 Cat 和 Dog 是 Animal 的子类(这听起来像第一堂课,但它不是我的作业承诺,只是简化真正的代码)
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
将参数更改为完全匹配会产生类似的错误,只是它说它不能从一个类转换为同一个类。
我已经成功地调用了从超类继承的子类函数和成员,所以我知道这在逻辑上应该可以工作。我只是不知道这种语言要我以什么扭曲的方式扭曲逻辑。
编辑
解决方案恰好是:指针混淆了所有人。
- 声明指针。
- 将指针作为参数发送给不处理指针的函数。
在我的示例中,我将“非指针”发送到需要指针的函数,我只是切换了它。现在它工作正常。
【问题讨论】:
-
检查编辑历史——第一个版本有
Dog spike,但后来改为Dog* spike。一开始可能是不正确的,但是在问题中看到不正确的代码对于理解它与答案中正确代码之间的区别至关重要。谁能详细说明为什么会发生这种变化,以及基于它或问题的第一个版本给出的最佳答案?
标签: c++ inheritance parameters subclass