学完c++面向对象基础后,紧随其后的便是继承了,可想而知继承的重要性!
一. 什么是继承
1.对于刚刚学完面向对象编程基础的朋友,看到这里的第一个问题就是什么是继承,这个可以直接从字面意思上理解,你可以继承其他人的财产,只要别人同意,同样对象也可以继承另一个对象的函数与变量。
2.在继承中,被继承的类称为基类或者父类,继承该类的类称为子类或者派生类。
3.继承可以最大限度的实现代码的复用。
4.下面给出继承的简单实例。
#include<iostream> using namespace std; class A{ private: int x; int y; public: A(int a,int b) { x = a; b = b; }; void disp() { cout<<x,y<<endl; } }; class B:public A #类B继承类A { private: int z; public: B(int a,int b, int c):A(a,b),z=c; }; int main() { B a(1,2,3); a.disp(); #类B可以调用类A的函数。 return ; }
在上述代码中,我们定义了类A和类B,类B继承类A,既类A称为父类或者基类,类B称为子类或者派生类。
二. 基类和派生类
1.基类
1.直接基类:B继承A,则A为B的直接基类。
2.间接基类:C继承B,B继承A,则A为C的间接基类。
2.public和private派生
1.在两种派生方法当中,主要的区别就是基类对象在派生类中是私有的还是公开的,下面这个表格中归纳了一下。
可见无论采用那种方法基类的private成员在派生类中和外部都是不可见的,而public成员在private派生方法中,在派生类中是private的,public中的派生类中是public的。
3. protected派生
在上面的派生中,如果派生类在往下派生一类的话,那么基类的变量便会不可以访问了,为了解决这个问题,由此产生了protected派生。
三. 多基派生
- 一个类继承其他的多个类称为多基派生。其声明和定义为
派生类名(参数表):基类名1(参数),基类名2(参数),.....,基类名n(参数n) { private: public: };
2.在多派生中会存在一个二义性问题,下面通过代码来说明。
#include<iostream> using namespace std; class A{ public: void print(){ cout<<"hello c++"<<endl; } }; class B{ public: void print(){ count<<"hello,c"<<endl; } }; class C:public A,public B { public: void disp() { print(); } }; int main() { C a; a.disp(); a.print(); return 0; }
在上述代码中,类A和类B中都有print函数,类C继承了A,B,在调用print函数的时候,编译器就不知道是那个类中的print函数,这样就出现了二义性。这个问题可以通过成员限定符来消除二义性。
a.A::print();
四. 虚基类
1.虚基类又是为了解决什么问题呢?这里四个类A,B,C,D,假如说,类B继承类A,类C也继承类A,类D继承类B和类C,这里便会出现一个问题,在类D中,会有两个类A的复制。
2.这样也会带来二义性。例如说,在类D中要调用类A中的函数,那会会出现是通过类B再到类A,还是通过类C再到类B呢?这便产生了二义性。
3.我们可以通过声明虚基类来消除类A在内存的双重复制,虚基类的定义为:
class 派生类名:virtual 派生方式 基类名 { };
在回到上面的问题中,这时候如果我们类B继承的是虚基类A,类C继承的虚基类A,类D继承类B和类C,那么便不会出现内存中出现两个类A了,从而取消了二义性。
五. 派生类的构造函数和析构函数
派生时,由于构造函数和析构函数是不能被继承的,所以对派生类我们需要重新定义。在创建派生类对象时,系统首先通过派生类的析构函数来调用基类的构造函数,完成基类成员的初始化,而后对派生类中新增的成员进行初始化。
1.派生类构造函数的一般格式为
派生类名 (派生类构造函数参数列表): 基类构造函数(基类构造函数参数列表){};
2.必须将基类的构造函数放在派生类的初始化表达式中,一调用基类构造函数完成基类数据成员的初始化,派生类构造函数实现的功能如下:
1.完成对象所占整块内存的开辟,由系统在构造函数时自动完成。
2.调用基类的构造函数完成基类成员的初始化。
3.若派生类中含对象成员、const成员或引用成员,则必须在初始化表中初始化。
4.派生类构造函数体执行。
3.派生类的析构函数
1.在对象被删除的时候,自动调用析构函数,其调顺序为先派生类,后基类。
Thank for your reading!
公众号:FPGA之旅