我有 2 个类:Parent
和 Child
。
class Child : public Parent {...};
我定义了一个变量
vector<Parent*> v;
v
有几个 Child
类的指针实例。
我有一个函数:
void myFunc(Child *c) {...}
当我调用 myFunc(v[1])
时,出现以下错误:
Argument of type "Parent*" is incompatible with parameter of type `Child*`.
我认为继承在这里应该没有问题,但事实并非如此。谁能帮忙?
最佳答案
你搞反了!问题是在 C++ 中,父子关系是一种方式。或者换句话说,这是一种IS-A 关系。
基本上这意味着虽然子类可以代替父类,即您可以将 sedan
传递给 automobile
vector ,但不能倒退。因为不是所有的汽车
都是轿车
。
你的函数定义应该是 void myFunc(Child *c) {...}
如果你只想接受子类,但如果你想接受父类的任何 child ,或者父本身,然后像这样做:void myFunc(Parent *p) {...}
代替。
还有一个小的旁注,我建议尽可能使用引用而不是指针。 See here for more discussion.
附录:
I want to use function overloading to define different behaviour for different types of Childs for myFunc. Any Idea how I can do this?
为了实现这一点,您可以使用模板并像这样使用特化:
#include <iostream>
class automobile {
};
class sedan : public automobile {
};
template <typename T>
void foo(T& t) {
std::cout << "An automobile!" << std::endl;
}
template <>
void foo<sedan>(sedan& t) {
std::cout << "A sedan!" << std::endl;
}
int main() {
automobile a;
sedan s;
foo<automobile>(a);
foo<sedan>(s);
}
预期的输出是:
An automobile!
A sedan!
关于C++ 类型参数与父类和子类的类型参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54892021/