父类对象等于子类对象--子类对象赋值给父类对象(附带实例)

本文探讨了C++等编程语言中,如何通过虚拟方法表实现多态性。当子类对象赋值给父类对象时,编译器自动进行向上转型。在运行时,调用方法会根据对象的实际类型决定,体现了多态的核心。通过一个具体的例子和内存分析,解释了这种机制,强调了父类决定偏移量,子类决定方法实现的设计思想。
摘要由CSDN通过智能技术生成

虚拟方法表*无论何时,一个类定义了一个虚拟方法,大多数编译器向类指定一个指向虚拟方法表(VMT或Vtable)的(虚拟)函数的指针数组添加一个隐藏的成员变量。这些指针在运行时用于适当的函数调用,因为在编译时它可能还不知道是否要调用基函数或者是从继承基类的类实现的派生类。

虚拟方法表解决方案在C++及其相关语言(如D和C#)中尤为常见。将对象的编程接口从实现分离出来的语言,像Visual Basic和 Delphi, 也可以使用虚拟表实现。因为它允许对象使用不同的实现,只需要使用一组不同的方法指针。

虚拟方法表特点这边涉及到继承(多态)的知识点
举个栗子:

DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类
a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法

分析:

  • 为什么子类的类型的对象实例可以覆给父类引用?
    自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;
  • a.play()将执行子类还是父类定义的方法?
    子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。

在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。

那么 :父类 对象 = new 子类()的意义就是为了实现多态(以不变应万变),其中,这句话中的父类就是为了方便找到偏移量,父类决定偏移量,子类决定方法实现,子类与父类中相同的方法与属性在各自的虚拟方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值