C++重载函数和子类
C++ Overloaded Function and Subclasses
假设我有:
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,编译器不会为您进行下转换。
相关文章:
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 由于签名差异,调用了错误的子类函数
- 从父类的向量访问子类函数,而无需向下转换
- 在子类函数覆盖中省略具有默认值的参数
- 有没有办法在C++中调用基类的所有子类函数?
- 无法调用子类函数,C++
- 子类作为模板模板基类的模板参数,而该类别又是子类函数参数
- 从同一父调用调用不同的子类函数
- 在子类函数中访问超类友元的受保护数据成员
- 调用子类函数
- 相对于更专业的继承函数,模板更喜欢子类函数
- 重载的子类函数,将子类的实例作为参数,如何使用
- 调用超类上不存在的子类函数
- 遗产.从父类调用子类函数
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 访问父类对象集合的成员的子类函数