C++ C++;类型的参数与父类和子类的类型的参数不兼容
我有两门课:C++ C++;类型的参数与父类和子类的类型的参数不兼容,c++,C++,我有两门课:Parent和Child class Child : public Parent {...}; 我定义了一个变量 vector<Parent*> v; 调用myFunc(v[1])时,出现以下错误: Argument of type "Parent*" is incompatible with parameter of type `Child*`. 我认为继承应该在这里正常工作,但事实并非如此。有人能帮忙吗?你把它倒过来了!问题是C++中的父子关系是一种方式。或者换
Parent
和Child
class Child : public Parent {...};
我定义了一个变量
vector<Parent*> v;
调用myFunc(v[1])
时,出现以下错误:
Argument of type "Parent*" is incompatible with parameter of type `Child*`.
我认为继承应该在这里正常工作,但事实并非如此。有人能帮忙吗?你把它倒过来了!问题是C++中的父子关系是一种方式。或者换句话说,这是一种“是-是”的关系 基本上这意味着,虽然儿童课程可以代替父母,也就是说,你可以将一辆
轿车
传递给汽车
向量,但你不能倒退。因为不是每辆汽车都是轿车
如果您只想获取子类,那么您的函数定义应该是void myFunc(Child*c){…}
,但是如果您想获取父类的任何子类,或者父类本身,那么可以像这样执行:void myFunc(parent*p){…}
作为一个小插曲,我建议尽可能使用引用而不是指针
增编:
我想使用函数重载为myFunc的不同类型的child定义不同的行为。你知道我该怎么做吗 为了实现这一点,您可以使用模板和专门化,如下所示:
#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);
}
你倒过来了!问题是C++中的父子关系是一种方式。或者换句话说,这是一种“是-是”的关系 基本上这意味着,虽然儿童课程可以代替父母,也就是说,你可以将一辆
轿车
传递给汽车
向量,但你不能倒退。因为不是每辆汽车都是轿车
如果您只想获取子类,那么您的函数定义应该是void myFunc(Child*c){…}
,但是如果您想获取父类的任何子类,或者父类本身,那么可以像这样执行:void myFunc(parent*p){…}
作为一个小插曲,我建议尽可能使用引用而不是指针
增编:
我想使用函数重载为myFunc的不同类型的child定义不同的行为。你知道我该怎么做吗 为了实现这一点,您可以使用模板和专门化,如下所示:
#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);
}
在OOP中,子类与父类之间存在“是”关系,但相反的关系是错误的。
这是合乎逻辑的,例如父类是人,子类是人,我们可以说人是人,但人是人这不是真的。在OOP中,子类与父类有“是”的关系,但相反的关系是假的。
这是合乎逻辑的,比如父母类是人,孩子类是男人,我们可以说男人是人,但是人是男人。这不是真的。你想错了,它没有问题。相反,C++中的公共继承表示“IS-A”原则,每个孩子都是父母。但是,反过来也不行,也就是说,父母不是孩子!与您的问题无关,但重要的是Liskov替换原则。我强烈建议你也读一下这一节。一定有dup,但找不到好的one@Slava这就是问题所在,我没有发现任何问题:-你想错了,它没有问题,相反,C++中的公共继承表示“IS-A”原则,每个孩子都是父母。但是,反过来也不行,也就是说,父母不是孩子!与您的问题无关,但重要的是Liskov替换原则。我强烈建议你也读一下这一节。一定有dup,但找不到好的one@Slava,这就是问题所在,我没有找到任何DUP:-)我想使用函数重载为
myFunc
的不同类型的Child
s定义不同的行为。知道我怎么做吗?你和一辆轿车有关系。你是一辆轿车。@DimaDz如果我正确理解了这个问题,我会编辑答案,告诉你如何使用templates@DimaDz更新的代码更能说明question@DimaDz模板的替代方案:如果每个孩子有不同的行为,利用多形性,使用virtual
方法将函数构建到类中。示例:我想使用函数重载为myFunc
的不同类型的Child
s定义不同的行为。知道我怎么做吗?你和一辆轿车有关系。你是一辆轿车。@DimaDz如果我正确理解了这个问题,我会编辑答案,告诉你如何使用templates@DimaDz更新的代码更能说明question@DimaDz模板的替代方案:如果每个孩子有不同的行为,利用多形性,使用virtual
方法将函数构建到类中。例子:
An automobile!
A sedan!