C++继承详解

继承

概念:
是一个很简单很直观的概念,与现实世界中的继承类似。可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。

使用的场景:
1) 当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能。

2) 当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以节省代码,也方便后续修改成员。

继承的一般语法为:
class 派生类名:[继承方式] 基类名{
派生类新增加的成员
};
实例 :
class Student: public People{

}

继承的方式:
继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。
1) public继承方式
基类中所有 public 成员在派生类中为 public 属性;
基类中所有 protected 成员在派生类中为 protected 属性;
基类中所有 private 成员在派生类中不能使用。

2) protected继承方式
基类中的所有 public 成员在派生类中为 protected 属性;
基类中的所有 protected 成员在派生类中为 protected 属性;
基类中的所有 private 成员在派生类中不能使用。

3) private继承方式
基类中的所有 public 成员在派生类中均为 private 属性;
基类中的所有 protected 成员在派生类中均为 private 属性;
基类中的所有 private 成员在派生类中不能使用。

改变访问权限:
使用 using 关键字可以改变基类成员在派生类中的访问权限。

C++继承时的名字遮蔽:
1) 如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。
2) 所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。
如果要使用该成员,需要加上类名和域解析符。例如stu.People::show();
3) 基类成员函数和派生类成员函数不构成重载 不管参数如何,只要名字一样就会造成遮蔽。

C++派生类的构造函数以及析构函数:
1)类的构造函数和析构函数都不能被继承
2)调用顺序:例如 A –> B –> C
创建 C 类对象时构造函数的执行顺序为:
A类构造函数 –> B类构造函数 –> C类构造函数 析构相反。
3) 调用基类的构造函数只能在构造函数初始化表中使用,会优先调用基类的构造函数与顺序无关。

C++类的多继承:
1) 多继承即一个派生类可以有两个或多个基类
2)多继承的语法也很简单,将多个基类用逗号隔开即可。
例如已声明了类A、类B和类C,那么可以这样来声明派生类D:
class D: public A, private B, protected C{
//类D新增加的成员
}
3) 多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。
4) 多继承形式下析构函数的执行顺序和构造函数的执行顺序与单继承相同。
5) 使用基类同名的成员时,在成员名字前面加上类名和域解析符::,消除二义性。

虚继承:
1) 在继承方式前面加上 virtual 关键字就是虚继承。
2) 虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class),不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。
3) 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。

C++向上转型:
1) 类其实也是一种数据类型,也可以发生数据类型转换,不过这种转换只有在基类和派生类之间才有意义,并且只能将派生类赋值给基类,包括将派生类对象赋值给基类对象、将派生类指针赋值给基类指针、将派生类引用赋值给基类引用,这在 C++ 中称为向上转型(Upcasting)。
2) 对象之间的赋值不会影响成员函数,也不会影响 this 指针。
3) 将派生类对象赋值给基类对象时,会舍弃派生类新增的成员,也就是“大材小用”。

将派生类指针赋值给基类指针:
1) 除了可以将派生类对象赋值给基类对象(对象变量之间的赋值),还可以将派生类指针赋值给基类指针(对象指针之间的赋值)。
2) 编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据;编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值