一、虚函数
虚函数定义:
就是在基类声明函数是虚拟的,并不是真实存在的函数,在派生类中才正式定义此函数。
虚函数指针的优先级最高
虚基类的作用:
允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
使得在继承间接共同基类时只保留一份成员。
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。
声明虚基类的一般形式:
class 派生类名:virtual 继承方式 基类名
成为虚函数的条件:
①函数能取地址;
②必须依赖对象。
虚函数表(编译期间)(一个类)
对象的生成 运行期间
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)这是一个声明语句,最后有分号。
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。
纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。
如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然为纯虚函数。