C++——继承

一、继承的概念

继承:实现类之间的复用,是代码复用最重要的手段,允许在保持原有类特性的基础上进行扩展

class Sudent :public Person//Student子类/派生类 public:继承方式 Person:父类/基类
{	
public:
	int _stuid;
	int _major;
};

二、继承的规则

·基类的私有成员在派生类中无论以什么方式继承都是不可见的,实际上还是继承了,但是语法上限制访问

·类中的私有和保护在当前类没有区别,在派生类中有差别,如果想让它被继承,就定义成protected

·基类中除私有外的其他成员在子类当中的访问方式:min(继承方式,基类中的访问限定),一般认为public>protected>private

·关键字class的默认继承方式是private,关键字struct的默认继承方式是public

·实际使用中,一般多使用public继承,几乎很少使用protected,private


三、子类和父类之间的赋值兼容规则

1.子类对象可以赋值给父类对象/指针/引用 ,一般称为切片/切割

Person p;
Sudent S;
p = s;
Person *ptr = &s; //  把子类中父类的一部分给切出来
Person &ref = s;


四、重定义/隐藏

·当父类和子类同时有同名成员时,不会报错, 子类成员会隐藏(重定义)父类成员,想调用父类成员需指定使用父类成员(Person::)

*注意:子类和父类的重名函数只构成重定义(隐藏),不构成重载, 因为重载要求在同一作用域


五、派生类的默认成员函数

  1. 派生类的构造函数必须(默认)调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表中显式调用。

  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。

  3. 派生类的operator=必须要调用基类的operator=完成基类的复制。

  4. 派生类对象初始化先调用基类构造再调派生类构造。

  5. 派生类对象析构清理先调用派生类析构再调基类的析构。

  6. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能 保证派生类对象先清理派生类成员再清理基类成员的顺序。

  7. 在多态中析构函数需要构成重写,重写的条件之一是函数名相同。编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。

如何让一个类不能被继承?

基类的构造函数需要显示调用,析构函数不需要显式调用,所以,把一个类的构造函数私有化,这个类就不能继承了


六、友元和静态成员

友元关系不能被继承

基类定义了一个静态成员,整个继承体系共有这个静态成员


七、菱形继承问题

继承可分为单继承和多继承

·单继承class Student:public Person

·多继承class Assistant:public Student,public Teacher 本身存在缺陷!

·菱形继承问题: 

使用多继承会导致菱形继承问题,派生类中多次包含相同的基类成员,造成数据冗余和二义性

二义性问题可以用指定来解决,而数据冗余无法解决。

·虚继承class Student:virtual public Person, 可以解决数据冗余和二义性的问题

虚继承解决冗余和二义性的原理: 通过编译器的内存窗口可以看到: 菱形继承的内存对象成员模型: 这里可以看到数据冗余,有多个来自不同父类的同一个基类的成员数据

菱形虚拟继承的内存对象成员模型:这里可以分析出D对象中将A放到的了对象组成的最下面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A,即虚基类


八、继承和组合

继承关系

class A{};

class B:public A

{};

组合关系

class C{};

class D

{
    C c;
};

继承和组合都是对类的复用

继承是白箱复用,组合是一种黑箱复用C对D是不透明的,C仍然保持着他的封装

组合的耦合度更低,继承的类是一种高耦合

public继承是一种is-a的关系,例如奔驰是一种车,组合是has-a的关系,例如车有轮胎,符合is-a用继承,符合has-a用组合,都符合时优先使用组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值