[C++]C++学习笔记(六)

1,类的继承
点击打开链接
概念:
继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。
作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类
单重继承:
从一个基类派生的继承称为单继承,换句话说,派生类只有一个直接基类
多重继承:
与此相对地,从多个基类派生的继承称为多继承或多重继承,也就是说,一个派生类有多个直接基类。
class 派生类名: 访问控制关键字 基类名1, 访问控制关键字 基类名2,...
{
  数据成员和成员函数声明
};


2,公有继承,私有继承,保护继承

基类成员 基类private成员 基类public成员
派生方式 private  public private public
派生类成员 不可见  不可见 可见  可见
外部函数 不可见  不可见 不可见  可见


private派生确保基类中的方法只能被派生类的对象的方法间接使用,而不能被外部使用。(has -a )
public派生使派生类对象与外部都可以直接使用基类中的方法,除非这些方法已经被重新定义。(is - a)


protected成员是一种血缘关系内外有别的成员。它对派生对象而言,是公有成员,可以访问;对血缘关系外部而言,与私有成员一样被隐藏。
protected派生:基类中的非私有成员在派生类中的访问属性都降一级


3,友元函数和友元类:
友元函数:
如果在某个类定义中用friend声明了一个外部函数(也许是其他类的一个成员)后,
这个外部函数便可以例外地访问该类的任何私有成员。用friend声明了的外部函数称为这个类的友元函数
友元类:
应当注意,友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元,类Y是否是类X的友元也要看类X中是否有相应的声明。


友元函数示例:

  1. #include "stdafx.h"    
  2.     
  3. class A    
  4. {    
  5. public:    
  6.     A(int _a):a(_a){};    
  7.     
  8.     friend int getA_a(A &_classA);//友元函数    
  9.     
  10. private:    
  11.     int a;    
  12. };    
  13.     
  14. int getA_a(A &_classA)    
  15. {    
  16.     return _classA.a;//通过对象名访问私有变量    
  17. }    
  18.     
  19. int _tmain(int argc, _TCHAR* argv[])    
  20. {    
  21.     A _classA(3);    
  22.     std::cout<<getA_a(_classA);//友元函数只是普通函数,可以在任意地方调用    
  23.     return 0;    
  24. }   
  25.   
  26. 友元类示例:  
  27. // TestFriend.cpp    
  28.     
  29. #include "stdafx.h"    
  30.     
  31. class B    
  32. {    
  33. public:    
  34.     B(int _b):b(_b){};    
  35.     
  36.     friend class C;//声明友元类C    
  37.     
  38. private:    
  39.     int b;    
  40. };    
  41.     
  42. class C//实现友元类C    
  43. {    
  44. public:    
  45.     int getB_b(B _classB){    
  46.         return _classB.b;//访问友元类B的私有成员    
  47.     };    
  48. };    
  49.     
  50.     
  51. int _tmain(int argc, _TCHAR* argv[])    
  52. {    
  53.     B _classB(3);    
  54.     C _classC;//定义友元类实例    
  55.     std::cout<<_classC.getB_b(_classB);    
  56.     return 0;    
  57. }    


4,虚继承:
C++使用虚拟继承(Virtual Inheritance),解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。
这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射
点击打开链接

原文地址:https://www.cnblogs.com/zhiliao112/p/4069210.html