虚函数 虚基类 虚继承
?};
?
?void ?main()
? {
? ? ?Camion c;
? ? ?Bike b;
? ? ?b.PrintTyre();
? ? ?c.PrintTyre();
?}
如上代 码,定义了一个交通工具类( Vehicle ), 类中有一函数可打印出交通工具的轮胎个数,但交通工具很多轮胎个数自然也就不确定,所以 就把它定 义为纯虚函数 , 也就是光定 义函数名不去实现它,类 Camion 继承了 Vehicle 并 实现了里面的代码,打印出有 4 个 轮胎。 Bike 类也是一样。 有一点 须要注 意一下, 纯虚函数不能实化化,但可以声明指针。?
总结?
? ? ?虚基 类?
? ? 1, 一个 类可以在一个类族中既被用作虚基类,也被用作非虚基类。?
? ? 2, 在派生 类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象。?
? ? 3, 虚基 类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。?
? ? 4, 最派生 类是指在继承结构中建立对象时所指定的类。?
? ? 5, 派生 类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用;如果未列出,则表示使用该 虚基 类的缺省构造函数。?
? ? 6, 从虚基 类直接或间接派生的派生类中的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用。但只有用于建立对象的最派生 类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象 只初始化一次。?
? ? 7, 在一个成 员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。?
? ? ?虚函数?
? ? 1, 虚函数是非静 态的、非内联的成员函数,而不能是友 元函数,但虚函数可以在另一个 类中被声明为友元函数。?
? ? 2, 虚函数声明只能出 现在类定义的函数原型声明中,而不能在成员函数的函数体实现的时候声明。?
? ? 3, 一个虚函数无 论被公有继承多少次,它仍然保持其虚函数的特性。?
? ? 4, 若 类中一个成员函数被说明为虚函数,则该成员函数在派生类中可能有不同的实现。当使用该成员函数操作指针或引用所标识的对象时 , 对该成员函数调用可采用动态联编。?
? ? 5, 定 义了虚函数后,程序中声明的指向基类的指针就可以指向其派生类。在执行过程中,该函数可以不断改变 它所指向的 对象,调用不同 版本的成 员函数,而且这些动作都是在运行时动态实现的。虚函数充分体现了面向对象程序设计的动态多态性。 纯虚函数 版本的成 员函数,而且这些动作都是在运行时动态实现的。虚函数充分体现了面向对象程序设计的动态多态性。?
? ? ?纯虚函数?
? ? 1, 当在基 类 中不能 为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,其实现留待派生类完成。?
? ? 2, 纯虚函数的作用是为派生类提供一个一致的接口。?
? ? 3, 纯虚函数不能实化化,但可 以声明指 针 。