c++入门---------继承篇

简介: 笔记

学完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.在两种派生方法当中,主要的区别就是基类对象在派生类中是私有的还是公开的,下面这个表格中归纳了一下。

15.png

可见无论采用那种方法基类的private成员在派生类中和外部都是不可见的,而public成员在private派生方法中,在派生类中是private的,public中的派生类中是public的。

3. protected派生

在上面的派生中,如果派生类在往下派生一类的话,那么基类的变量便会不可以访问了,为了解决这个问题,由此产生了protected派生。

16.png

三. 多基派生

  1. 一个类继承其他的多个类称为多基派生。其声明和定义为
派生类名(参数表):基类名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之旅


目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
36 2
C++入门12——详解多态1
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
24天前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
17 0
|
24天前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
21 0
|
28天前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
16 0
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
27 0