继承的概念
在C++,继承是一种可以代码复用的重要手段,它允许一个类继承另一个类的属性和方法。继承可以实现类之间的层次关系,提供代码重用和多态性有关的功能。同时,C++支持多重继承,即一个类可以继承多个基类的特性
继承的定义
class ChildClass : [访问限定符] BaseClass
{// 子类的成员和函数定义
};
ChildClass是子类,也称做派生类
BaseClass是父类,也称作基类
继承关系和访问限定符
继承基类成员访问方式的变化
类成员/继承方式 | public继承 | protected继承 | private继承 |
---|---|---|---|
基类的public成员 | 派生类的public成员 | 派生类的protected成员 | 派生类的private成员 |
基类的protected成员 | 派生类的protected成员 | 派生类的protected成员 | 派生类的private成员 |
基类的private成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
基类和派生类对象复制转换
- 派生类对象可以赋值给基类的对象/基类的指针/基类的引用。
- 基类对象不能赋值给派生类对象
- 基类的指针可以通过强制类型转换赋值给派生类的指针
继承中的作用域
- 在继承体系中基类和派生类都有独立的作用域
- 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用基类::基类成员 显示访问)
- 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏
- 注意在实际中在继承体系里最好不要定义同名的成员
派生类的默认成员函数
- 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员,如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用
- 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化
- 派生类的operator=必须要调用基类的operator=完成基类的复制
- 派生类的析构函数会在调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序
- 派生类对象初始化先调用基类构造再调派生类构造
- 派生类对象析构清理先调用派生类析构再调基类的析构
继承和友元
-
C++中的继承是指一个类可以从另一个类派生出来,并继承父类的属性和方法。继承使得派生类可以重用父类的代码,并且可以在派生类中添加新的成员和方法。
-
友元是一种C++特性,允许一个类或函数访问另一个类的私有成员。通过友元关系,可以在一个类中将其他类或函数声明为友元,从而使其能够访问本类的私有成员。
-
继承和友元是两个不同的概念,在C++中可以同时使用。派生类可以继承父类的友元函数或友元类,也可以在自己的类中声明别的类或函数为友元。使用友元的目的是为了实现类之间的访问权限控制,使得某些类或函数可以操作其他类的私有成员。
继承与静态成员
-
在C++中,继承可以包括父类的静态成员,而这些静态成员在派生类中也是共享的。
-
当派生类继承父类时,它同样继承了父类的静态成员。这意味着派生类可以直接访问父类的静态成员,而无需创建父类对象。派生类可以使用父类的静态成员函数和静态成员变量,也可以通过父类名限定使用。
-
此外,当派生类重新定义了一个父类的静态成员时,该静态成员在派生类中将会覆盖父类中的静态成员。这意味着在派生类中使用相同名称的静态成员时,将使用派生类自己的静态成员,而不是父类的静态成员。
-
需要注意的是,继承父类的静态成员并不会增加派生类对象的大小,因为静态成员只有一个实例,无论继承多少次,都只会存在一个。静态成员在编译时就已经分配内存,不依赖于对象的创建。
成员并不会增加派生类对象的大小,因为静态成员只有一个实例,无论继承多少次,都只会存在一个。静态成员在编译时就已经分配内存,不依赖于对象的创建。