C++ 类型参数与父类和子类的类型参数不兼容

标签 c++

我有 2 个类:ParentChild

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/

相关文章:

c++ - 从当前捕获中获取设备 ID

android - 用通用的东西替换 WCHAR 和 wchar_t

c++ - 制作头文件时遇到问题

c++ - 在 C++/内存分配中观察到的未定义行为

c++再次初始化非指针对象

c++ - 在 C++ 中分两步将参数绑定(bind)到函数?

c++ - 使用静态局部变量获取绑定(bind)/推断捕获 lambda 的函数指针

c++ - 使用匿名 mmap() 检查实际分配的页面数

c++ - Unordered_map 到二进制文件

c++ - 为什么取消引用多态指针将获得指针的类型而不是对象的类型?