假设我有:
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对象。
答案 0 :(得分:2)
重载函数A(Vehicle*)
更适合类型Vehicle*
的参数。因此cout
将打印:
vehicle
说明:
重载的函数解析基于 static 类型的参数完成。参数v
的 static 类型为Vehicle*
。因此,将调用函数A(Vehicle*)
。
答案 1 :(得分:1)
"vehicle"
打印出来
这是因为v的静态类型是Vehicle。因此编译器使用为Vehicle定义的A。
编译器在调用成员函数进行虚方法调用时使用动态类型信息。关键字virtual是必需的。在这种情况下,“this”指针将在适当的覆盖级别适当地向下转换。
但是,除了这种特殊情况之外,如果没有显式的dynamic_cast,编译器将不会为你做广告。
答案 2 :(得分:1)
这是静态绑定的示例。在编译期间,很明显将调用string A(Vehicle *v)
函数。当然“车辆”应该在输出中。