本文共 1856 字,大约阅读时间需要 6 分钟。
1. 动态绑定使编译器能够在运行时决定使用在基类中定义的函数还是在派生类中定义的函数。
2. 定义为virtual的函数是基类希望派生类重定义的,基类希望派生类继承的函数不能定义为虚函数。
除了构造函数外,任意非static成员函数都可以是虚函数。virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义中。
如果几类定义了static成员,则整个继承层次中只有一个这样的成员。无论从基类派生出多少个派生类,每个static成员只有一个实例。
Static成员遵循常规访问控制:如果成员在基类为private,则派生类不能访问它。如果不是private,则既可以通过基类访问,也可以通过派生类访问。
3. 通过基类的引用、指针调用虚函数时,发生动态绑定。
4. protected成员可以被派生类对象访问,但不能被基类的普通用户访问。
5. 类派生列表:这里access-label是public、protected或private。派生类可以进一步限制但不能放松对所继承的成员的访问。
如果是public继承,则基类成员保持自己的访问级别,基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。
如果是protected继承,基类的public和protected成员在派生类中为protected成员。
如果是private继承,基类所有成员在派生类中为private成员。
6. 派生类中虚函数的声明必须与基类中的定义方式完全匹配。但有一个例外:返回对基类类型引用的虚函数,在派生类中可以返回对派生类型的引用。
7. 如果希望覆盖虚函数机制并强制调用虚函数的特定版本,可以使用作用域操作符。
8. 使用class保留字定义的派生类默认具有private继承,而用struct保留字定义的类默认具有public继承。
9. 友元可以访问类的private和protected数据。友元关系不能继承,基类的友元对派生类的成员没有特殊访问权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该积累的派生类不能访问授予友元关系的类。
10. 如果将派生类型的对象传给希望接受【基类引用】的函数,引用将直接绑定到该对象,对象本身未被复制,实际上实参是该对象的引用。
将派生类对象传给希望接受基类类型对象的函数时,情况不同,会将派生类类型对象的基类部分复制到形参,构造一个基类类型对象。
11. 如果是public继承,用户代码和后代类都可以使用派生类到基类的转换。如果是使用private或protected继承,则用户代码不能将派生类类型对象转换为基类对象。
12. 构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。
如果想要构造只希望派生类使用的构造函数,可将该构造函数定义为protected。
13. 派生类的合成默认构造函数的基类部分由基类的默认构造函数初始化,派生类部分由各成员的默认构造函数构造。
派生类构造函数的初始化列表只能初始化派生类成员,不能直接初始化继承成员,可将基类包含在构造函数初始化列表中来间接初始化继承成员。
派生类应通过使用基类构造函数尊重基类的初始化意图,而不是在派生类构造函数体中对这些成员赋值。
14. 如果派生类显式定义自己的复制构造函数或赋值操作符,则基类的复制构造函数和赋值操作符负责对基类成分以及派生类自己的成员进行复制或赋值。
15. 派生类析构函数不负责撤销基类对象的成员,而是显示调用基类的析构函数,每个析构函数只负责清除自己的成员。
16. 构造函数不能定义为虚函数,构造函数是在对象完全构造之前运行的,此时对象的动态类型还不完整。
17. 在基类和派生类中使用同一名字的成员函数,与数据成员一样,在派生类作用域中派生类成员将屏蔽基类成员,即使函数原型不同。
18. 派生类不用重定义所继承的每一个基类版本,它可以为重载成员提供using声明。一个using声明只能指定一个名字,不能指定形参表。因此,为基类成员函数名称而作的using声明,将把该函数的所有重载实例加到派生类的作用域。
19. 纯虚函数:在函数形参表后面写上=0以指定纯虚函数。纯虚函数说明,该函数为后代类型提供了可覆盖的接口,但是当前这个类的版本绝不会调用。
20. 基类通常也应定义一个虚析构函数。如果经常会在指向基类的指针实际指向派生类对象时删除它,析构函数就必须为虚函数。
转载地址:http://bwbdi.baihongyu.com/