c++中的继承

c++中的继承,第1张

目录

继承的概念和定义

继承的概念:

继承的定义:

基类和派生类的赋值转换(切片)

继承中的作用域

继承中的默认成员函数

继承和友元的关系

继承和静态成员的关系

继承中的菱形继承问题

继承里的虚继承

继承的总结


继承的概念和定义 继承的概念:

继承是一种使对象复用的有效手段,被继承的类叫做父类(基类),继承类的类叫做子类(派生类)

继承的定义:

继承的格式:

 继承的关系:

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;
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存