作者:mobiledu2502929697 | 来源:互联网 | 2023-08-24 16:14
继承召唤多态。多态就是多种形态。因继承而生创建出的对象理所当然地拥有其基类的所有成员,所以从本质上来说,它既可以被称为是子类的对象,又可以被称为是父类的对象。如果子类和父类中定义了完全相同的两个成员函数,又对新创建的子类对象调用这个成员函数,那么就会分不清是调用基类的还是子类的。解决办法是虚函数机制。
将基类函数标记为virtual虚函数,编译时则暂时将绑定对象这一步滞后(没运行前不知道是子类还是基类),而是做一个向即将绑定的该实际对象的成员函数的间接访问。那么在运行时,就能根据情况选择子类函数还是基类函数。虚函数是自动继承的,但要分清虚函数和重载的关系。虚函数之间必须完全相同,重载是参数不同。重载是确定的,编译器在编译的时候就能根据参数的情况准确判断该函数属于基类还是子类,但虚函数无法被判断,必须滞后到运行时处理。对于虚函数,有个返回类型的例外,就是当虚函数仅有返回类型不同,且返回类型之间是基类和子类的关系,则仍能识别(理解起来,就是我传给你的基类你返回就是基类,传进去子类就返回子类)。静态成员函数、内联函数、构造函数不是虚函数。析构函数常声明为虚函数。虚函数和虚继承有区别。虚继承是解决多继承中成员变量或成员函数命名冲突问题的,用虚继承的派生类,在构造的时候就只会保留继承的一份类成员。虚继承跟基类基本没影响,是子类构建的时候才会生效。
多态性还体现在类型转换。定义的沙发床类有的时候我想让它表现出家具的特性,有的时候想表现出沙发床的特性,这就要多态地识别类型。动态转型dynamic_cast专门针对有虚函数的继承结构,静态转型static_cast就可以更广。