【问题标题】:C++ Overloaded Function and SubclassesC++ 重载函数和子类
【发布时间】:2011-04-25 14:25:22
【问题描述】:

假设我有:

struct Vehicle {...}
struct Car : public Vehicle {...}

string A(Vehicle *v) { return "vehicle"; }
string A(Car *c) { return "car"; }

我这样做:

Vehicle *v = new Car();
cout << A(v);

为什么编译器会打印出“vehicle”?毕竟,v 指向一个 Car 对象。

【问题讨论】:

  • 你试过运行它看看会发生什么吗?
  • 你试过编译吗?至少应该有一个警告......
  • 在这个问题上绝对是 -1 - 可以通过编译器的一分钟努力立即解决。
  • @Doug @Flinsch @DeadMG,我对编译器的功能不感兴趣。我有兴趣了解 C++ 规范的内容以及原因。例如它可能是未定义的。
  • 除非没有任何实现不符合这样的要求。

标签: c++ oop polymorphism overloading


【解决方案1】:

重载函数A(Vehicle*) 更适合Vehicle* 类型的参数。所以cout 会打印出来:

vehicle

说明:

重载函数解析是基于静态类型的参数来完成的。而参数vstatic 类型是Vehicle*。因此会调用函数A(Vehicle*)

【讨论】:

    【解决方案2】:

    这是静态绑定的示例。在编译过程中,很明显会调用string A(Vehicle *v) 函数。当然“车辆”应该在输出中。

    【讨论】:

      【解决方案3】:
      "vehicle" 
      

      打印出来

      这是因为 v 的静态类型是 Vehicle。因此,为 Vehicle 定义的 A 被编译器使用。

      编译器在调用成员函数进行虚方法调用时使用动态类型信息。关键字 virtual 是必需的。在这种情况下,“this”指针将在适当的覆盖级别适当地向下转换。

      但是,在这种特殊情况之外,如果没有明确的 dynamic_cast,编译器不会为您向下转换。

      【讨论】:

      • 这是有道理的。感谢道格的回答!
      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 2016-10-27
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2012-02-07
      相关资源
      最近更新 更多