C++ 知识:继承、派生类、虚基类、虚函数

时间:2022-08-17 18:55:43
  • 继承和派生类
    • 如果一个类只有一个基类则称 ‘单继承’,否则称为 ‘多继承’。通过类继承,可以是派生类有条件的具有基类的属性,这个条件就是继承方式。
    • 在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员;在私有继承和保护继承时,基类的所有成员不能被派生类的对象访问,而派生类的成员函数可以访问基类中的公有成员和保护成员。
    • 基类的构造函数和析构函数不能被派生类继承。但是,当派生类的构造函数和析构函数被执行时,基类相应的构造函数和析构函数也会被执行。注意:派生类对象在建立时,先执行基类的构造函数,然后执行派生类的构造函数。
  • 多继承
    • 一个派生类可以继承多个基类,这种多继承的方式可以使派生类具有多个基类的特性,不仅使程序结构清晰,而且大大提高了程序代码的可重用性。
class C : public A, private B {};
  • 虚基类
    • 域作用运算符 ‘::’ 可以用来消除继承过程中出现的二义性。
    • 虚基类的目的是在多重派生的过程中,使公有的基类在派生中只有一个复制,从而解决二义性的问题。
    class B1 : virtual public A {}; /// 声明虚基类
  • 多态性
    • 多态是面向对象程序设计的重要特性之一,与封装性、继承性共同构成了面向对象程序设计的三大特性。
    • C++ 中,多态性可分 2 种:编译时的多态性和运行时的多态性。编译时的多态性是通过函数的重载或运算符的重载来实现的。而运行时的多态是通过虚函数来实现的,它是指在程序执行之前,根据函数和参数还无法确定应该调用哪一个函数,必须在程序的执行过程中,根据执行情况动态地确定。
    • 与这 2 种多态性对应的是 2 种编译方式:静态联编和动态联编。联编(binding,又称绑定)就是将一个标识符和一个存储地址联系在一起的过程,或是一个源程序经过编译、连接,最后生成可执行代码的过程。静态联编是指这种联编在编译阶段完成,由于联编过程是在程序运行之前完成的,所以称为早期联编。动态联编是指这种联编要在程序运行时动态进行,所以又称为晚期联编。
  • 虚函数
    • 基类指针可以通过虚函数达到访问派生类对象成员函数的目的,从而是一个函数具有多种不同的版本,这一点与函数重载相似,只不过虚函数的不同版本是在该基类的派生类中重新定义的。这样,只要声明了基类指针就可以使用不同的派生类对象的函数,从而实现程序运行时的多态。
    • 注意 1:虚函数在重新定义时,参数的个数和类型必须和基类中的虚函数完全匹配,这一点和函数重载完全不同。
    • 注意 2:只有通过基类指针才能实现虚函数的多态性,若虚函数的调用是普通方式来进行的,则不能实现其多态性。
    • 注意 3:虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。
    • 注意 4:可以把析构函数定义为虚函数,但不能把构造函数定义为虚函数。
    CShape ss;  ss.area();  /// 注意2:只能调用 CShape 的成员函数,而不能够调用派生类的虚函数。