C ++重载函数和子类

时间:2011-04-25 14:25:22

标签: c++ oop polymorphism overloading

假设我有:

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对象。

3 个答案:

答案 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)函数。当然“车辆”应该在输出中。