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

一、虚函数

虚函数定义:

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

虚函数指针的优先级最高

虚基类的作用:

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

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

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

声明虚基类的一般形式:

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

成为虚函数的条件:

            ①函数能取地址;

扫描二维码关注公众号,回复: 6153986 查看本文章

            ②必须依赖对象。

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

对象的生成   运行期间

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

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

      ②析构函数  (可以)

      ③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)这是一个声明语句,最后有分号。
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。
纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。
如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然为纯虚函数。

猜你喜欢

转载自blog.csdn.net/like_that/article/details/89739004