目录
继承的概念和定义
继承的概念:
继承的定义:
基类和派生类的赋值转换(切片)
继承中的作用域
继承中的默认成员函数
继承和友元的关系
继承和静态成员的关系
继承中的菱形继承问题
继承里的虚继承
继承的总结
继承的概念和定义 继承的概念:
继承是一种使对象复用的有效手段,被继承的类叫做父类(基类),继承类的类叫做子类(派生类)
继承的定义:继承的格式:
继承的关系:
1、继承方式和访问限定符都有三种权限
2、假如访问权限和继承方式结合,取权限小的访问方式
3、private中的不可见不是说不会被继承,是被继承下来我们不能够去使用它
4、假如我们想让外界访问不了基类成员,又想让派生类访问,那么就可以使用protest访问限定符修饰成员
5、假如我们不写继承方式,class创建出来的类默然是private,struct创建出来的类默然是public,但还是推荐手动加上继承方式
6、一般而言使用public继承方式,因为其他继承方式的可维护性低
派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用,但是基类不可以赋值给派生类,这种方式就叫做切片
person p = s;
person* ptr = &s;
person& ref = s;
//都叫切片
继承中的作用域
1、基类和子类都拥有自己独立的作用域
2、当基类和派生类的成员变量同名时候,就会构成隐藏(也叫重定义),这个时候我们需要使用父类::成员名来进行访问,成员函数同名,也会构成隐藏
3、继承中尽量不要定义同名的成员
假如基类没有默认构造函数,对于构造函数、拷贝构造、赋值运算符重载要自己调用
当我们调用构造函数、拷贝构造、赋值运算符重载时候需要使用基类名::函数,因为它们会和派生类构成函数重载
析构编译器自动调用(为了满足派生类先析构,基类后析构)
继承和友元的关系派生类不会继承基类的友元关系
继承和静态成员的关系对于静态成员,如果被继承下来,那么整个继承类中都只会有这一份静态成员
继承中的菱形继承问题class A
{};
class B:public A
{};
class C:public A
{};
class D:public B, public C
{};
假如D继承了B和C,B和C又同时继承了A,这个时候就会出现菱形继承情况
多继承会产生两个情况
1、二义性,不是到使用的是B继承下来的A的成员还是C继承下来的A的成员(这个时候需要类名::成员来指定使用的是哪个继承下来的变量)
2、数据冗余,存有两份A
为了解决多继承中菱形继承的问题,c++创建了一种虚继承的方式来解决这种问题
class A
{};
class B:virtual public A
{};
class C:virtual public A
{};
class D:public B, public C
{};
在:后面加上virtual关键字,来进行多继承,这样就只会创建一份A的成员了,在同时继承的两个成员旁边进行虚继承
继承和组合在写两个类之间的关系的时候,尽量多使用组合,而不是继承
继承:
class Car
{};
class Baoma:public Car //继承
{};
组合:组合就是在一个类中声明另一个类的对象
class Baoma:public Car
{};
class Person
{
public:
Baoma b; //组合就是在一个类中声明另一个类的对象
};
继承会破坏类的封装性,因为public继承可以访问protect成员,组合不会,还是只能访问public的成员
假如两个类是is-a的关系,还是可以使用继承
class Car
{};
class Baoma:public Car //is-a的关系,所以可以用继承,Baoma是Car
{};
假如两个类是has-a的关系,更推荐使用组合
class Baoma
{};
class Person //has-a的关系,可以用组合,Person有一辆宝马
{
public:
Baoma b;
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)