虚拟函数与多态

 1、如果你以一个基础类别的指针指向衍生类的对象,那么经由该指针,你只能调用基础类所定义的函数。

class  CBase
{
BaseFunc();
}

Class CDerived :publci CBase
{
DeriFunc();
}

CBase
*  pBase;

虽然我们可以令pBase实际指向CDerived对象,却因为pBase的类型(一个CBase*指针),使它只能够调用BaseFunc(),不能够调用DerFunc()。

 

   2、如果你以一个衍生类的指针指向一个基础类的对象,你必须先做明显的转型。这样做法很危险。

CDerived* pDeri;

CBase aBase("JaSon");

pDeri = &aBase; //这样做法很危险,不符合真实的生活经验。

 

   3、如果基础类和衍生类都定义了相同名称的成员函数,那么透过对象指针调用成员函数时,到底调用哪一个函数,必须视该指针的原始类型而定,而不是由指针实际所指的对象类型来决定。

Code

 

      虚拟函数的作用:可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。

     虚函数是动态绑定的基础,是非静态的成员函数。在类的声明中,在函数原型之前写virtual。virtual 只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
     本质:不是重载声明而是覆盖。
     调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。

    纯虚拟函数不需要定义其实际动作,它的存在只是为了在衍生类中被重新定义,只是为了提供一个多态接口。只要是拥有纯虚拟函数的类,就是一种抽象类,它是不能够被具体化的。

有关虚拟函数的结论:

   1、如果你期望派生类重新定义一个成员函数,那么你就应该在基础类中把此函数设为virtual。

   2、以单一指令唤起不同函数,这种性质称为Polymorphism,意思是“the ability to many forms”,也就是多态。

   3、虚拟函数是c++语言的多态性及动态绑定的关键。

   4、既然抽象类中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上“=0”即可)。

    5、抽象类不能产生具体的对象实体,但是我们可以拥有指向抽象类的指针,以便于操作抽象类的各个派生类。

   6、虚拟函数派生下去仍为虚拟函数,而且可以省略virtual关键词。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值