【C++】继承和多态——虚函数和纯虚函数

一、虚函数

虚函数定义:

  就是在基类声明函数是虚拟的,并不是真实存在的函数,在派生类中才正式定义此函数。

        拥有Virtual 关键字的函数称之为虚函数,虚函数的作用是实现动态绑定的,也就是说程序在运行的时候动态的的选择合适的成员函数。要成为虚函数必须满足两点,一就是这个函数依赖于对象调用,因为虚函数就是依赖于对象调用,因为虚函数是存在于虚函数表中,有一个虚函数指针指向这个虚表,所以要调用虚函数,必须通过虚函数指针,而虚函数指针是存在于对象中的。二就是这个函数必须可以取地址,因为我们的虚函数表中存放的是虚函数函数入口地址,如果函数不能寻址,就不能成为虚函数。

虚函数指针的优先级最高

虚基类的作用:

          允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

          使得在继承间接共同基类时只保留一份成员。

虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。

声明虚基类的一般形式:

class 派生类名:virtual 继承方式 基类名

成为虚函数的条件:

            ①函数能取地址;

            ②必须依赖对象。

虚函数表(编译期间)(一个类)

对象的生成   运行期间

1、哪些函数可以成为虚函数,哪些不能?

      ①构造函数(不能,因为没有依赖对象调用)wu

      ②析构函数  (可以)

      ③static修饰的成员方法(不能,没有依赖对象调用)

      ④inline函数 (不能,因为不能取地址)

      ⑤普通的类成员方法(可以)

      ⑥静态的类成员方法 (不能)

 2、什么条件下发生动多态的调用?

      ①指针调用虚函数;

      ②对象要完整。

3、基类和派生类中的析构函数满足同名覆盖的关系

4、基类指针指向派生类对象(派生类对象中的起始部分)的时候,基类中的析构函数设为虚函数?

    避免资源泄漏

5、对象的虚函数指针什么时候指向虚表的?

      虚表的写入时机---->在构造函数第一行代码执行之前。

 

二、纯虚函数

声明纯虚基类的一般形式:

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

拥有纯虚函数的类为抽象类(抽象类不能生成对象),通过引用或者指针来实现

class Person
{
   virtual void display()       //虚函数
   {
         cout<<   <<endl;
    }
   virtual void Display () = 0; // 纯虚函数
protected :
   string _name ; // 姓名
};
class Student : public Person
{};

(1)纯虚函数没有函数体;
(2)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是虚函数”;
(3)这是一个声明语句,最后有分号。
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。
纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。
如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然为纯虚函数。

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值