C++重载函数和子类

C++ Overloaded Function and Subclasses

本文关键字:子类 函数 重载 C++      更新时间:2023-10-16

假设我有:

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);

为什么编译器会打印出"车辆"?毕竟,v指向一个Car对象。

重载函数A(Vehicle*)与类型为Vehicle*的参数更匹配。因此cout将打印:

vehicle

解释:

重载函数解析是基于静态类型的参数完成的。参数v静态类型为Vehicle*。因此,将调用函数A(Vehicle*)

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

"vehicle" 

打印出

发生这种情况是因为v的静态类型是车辆。因此,为Vehicle定义的A被编译器使用。

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

然而,在这种特殊情况之外,如果没有显式dynamic_cast,编译器不会为您进行下转换。