9虚函数与多态性~

类指针的关系

1.直接用基类指针引用基类对象;
2.直接用派生类指针引用派生类对象;
3.用基类指针引用一个派生类对象;
4.用派生类指针引用一个基类对象。

class A;
class B:public A;
A * p ; // 指向类型 A 的对象的指针
A A_obj ; // 类型 A 的对象
B B_obj ; // 类型 B 的对象
p = & A_obj ;// p 指向类型 A 的对象
p = & B_obj ;// p 指向类型 B 的对象,它是 A 的派生类

p可以通过B_obj 访问所有从A类继承的元素,但是不能用p访问B类自定义的元素(除非用显示类型转换)
注意:不能将一个声明为指向派生类对象的指针指向其基类的对象。派生类指针只有经过强制类型转换之后,才能引用基类对象

虚函数和动态联编

首先,基类指针对函数的操作只能绑定到基类的成员函数
根据赋值兼容,用基类类型的指针指向派生类,就可以通过这个指针来使用类(基类或派生类)的成员函数。若这个函数是普通的成员函数,通过基类类型的指针访问到的只能是基类的同名成员。如果将它设置为虚函数,则可以使用基类类型的指针访问到指针正在指向的派生类的同名函数。

实现动态联编方式的前提

1.声明虚函数
2.派生类***公有***继承基类
3.通过指针与引用来调用虚函数

***关键字 virtual 的成员函数称为虚函数***必须用基类指针调用派生类的不同实现版本

虚函数的重载特性

在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同
注意:
1.构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。
2.析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象。
3.虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数
4.构造函数、内联成员函数、静态成员函数不能是虚函数。 (虚函数不能以内联的方式进行处理)

纯虚函数和抽象类

在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。一个具有纯虚函数的基类称为抽象类如果子类继承基类,派生类没有给出纯虚函数的实现,那么这个派生类也是抽象类

virtual 类型 函数名(参数表)= 0 ;

注意:

shape x ; // error,抽象类不能建立对象
shape *p ; // ok,可以声明抽象类的指针
shape f ( ) ; // error, 抽象类不能作为函数返回类型
void g ( shape ) ; // error, 抽象类不能作为传值参数类型
shape & h ( shape &) ; // ok,可以声明抽象类的引用``

异质链表

把不同类对象统一组织在一个数据结构中,可以定义抽象类指针数组或链表。由于这种表中的具有不同类类型元素(它们都有共同的基类),所以称为“异质表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jdicat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值