Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类型的参数与父类和子类的类型的参数不兼容_C++ - Fatal编程技术网

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!