c++继承是c里面学习比较难的,在这里告诉你c++继承,从各个方面来给你一一击破难点。让你快速学习。
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
如何实现继承?
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
class derivedclass: accessspecifier baseclass
其中,访问修饰符 access-specifier 是 public、
protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为private。
注:
子类也可以称为派生类,父类可以称为基类。
继承后,子类会完全继承父类中所有的成员变量和成员函数(除父类的构造函数以外)
public :公有的成员在任何地方都可以访问
protected:受保护的成员,在类的作用范围内可以访问,友元也可以访问,在其派生类中也可以访问,在类的外部不能访问。
private:私有的成员在类的作用范围内可以访问,友元也可以访问。
一个派生类继承了所有的基类方法,但下列情况除外:
基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符。
基类的友元函数。
构造和析构的顺序:
子类的构造函数一定会先调用父类的构造函数,先初始化从父类继承而来的成员变量,再调用自己的构造函数初始化新增的成员变量。
析构相反,先调用子类的析构函数释放新增内存,再调用父类的析构函数释放从父类继承而来的部分。
当父类的构造函数没有参数的时候,子类的构造函数可以不主动调用父类的构造函数,但是父类的构造函数依然会被自动调用。
三种继承方式:
1.公有继承 父类的公有成员继承到子类中是公有属性,父类的保护成员继承到子类中是保护属性,父类的私有成员继承到子类中不可访问。
2.保护继承 父类的公有成员继承到子类中是保护属性,父类的保护成员继承到子类中是保护属性,父类的私有成员继承到子类中不可访问
3.私有继承 父类的公有成员继承到子类中是私有属性,父类的保护成员继承到子类中是私有属性,父类的私有成员继承到子类中不可访问
公有成员保护成员私有成员
公有继承公有成员保护成员不可访问成员(通过基类接口访问)
保护继承保护成员保护成员不可访问成员(通过基类接口访问)
私有继承私有成员私有成员不可访问成员(通过基类接口访问)
在类的内部:只有父类的私有成员不能访问。
在类的外部:只能访问该对象的公有成员
多层继承
A继承自B,B继承自C,可以得出,A继承了C,继承具有传递性多重继承
一个类继承自多个父类
如何多重继承?
class 子类名 :public 父类1名, public 父类2名...
{
子类成员....
};
多重继承构造函数的顺序?
一定先从左到右依次调用父类的构造函数,再调用自己的构造函数析构的顺序相反。
多重继承会引发二义性,如何解决?
方法1:在调用具有二义性的成员函数时,指明函数的作用域,到底是从哪个基类继承而来的。
方法2:虚继承
C++使用虚拟继承(Virtual Inheritance),解决从不同途径继承
来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,
将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员
在内存中就只有一个拷贝,同一个函数名也只有一个映射。
继承的关系
has-a 有什么。 组合关系不能构成继承关系 is-a 是什么, 能构成继承关系
like-a 像什么一样 不能构成继承关系 as---a 作为实现手段 不能构成继承关系总结:
当类中有成员变量是其他类的对象的时候,先从上到下依次构造对象成
员,再调用自己的构造函数。
析构的顺序相反。
当类中既有多重继承,又有成员变量是其他类的对象,先从左到右依次调用父类构造函数,再从上到下
依次构造对象成员,最后调用自己的构造函数。